it-swarm.dev

إعادة التوجيه إلى عنوان URL خارجي من إجراء وحدة التحكم في Spring MVC

لقد لاحظت أن الكود التالي يعيد توجيه المستخدم إلى عنوان URL داخل المشروع ،

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = "yahoo.com";
    return "redirect:" + redirectUrl;
}

في حين ، تتم إعادة توجيه التالي بشكل صحيح كما هو مقصود ، ولكنه يتطلب http: // أو https: //

@RequestMapping(method = RequestMethod.POST)
    public String processForm(HttpServletRequest request, LoginForm loginForm, 
                              BindingResult result, ModelMap model) 
    {
        String redirectUrl = "http://www.yahoo.com";
        return "redirect:" + redirectUrl;
    }

أريد إعادة التوجيه دائمًا إعادة التوجيه إلى عنوان URL المحدد ، سواء كان به بروتوكول صالح أم لا ولا تريد إعادة التوجيه إلى طريقة عرض. كيف أقوم بذلك؟

شكر،

88
Jake

يمكنك أن تفعل ذلك بطريقتين.

أول:

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public void method(HttpServletResponse httpServletResponse) {
    httpServletResponse.setHeader("Location", projectUrl);
    httpServletResponse.setStatus(302);
}

ثانيا:

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
public ModelAndView method() {
    return new ModelAndView("redirect:" + projectUrl);
}
161
Rinat Mukhamedgaliev

يمكنك استخدام RedirectView. منسوخة من JavaDoc :

عرض إعادة التوجيه إلى عنوان URL نسبي مطلق أو قريب للسياق أو للطلب الحالي

مثال:

@RequestMapping("/to-be-redirected")
public RedirectView localRedirect() {
    RedirectView redirectView = new RedirectView();
    redirectView.setUrl("http://www.yahoo.com");
    return redirectView;
}

يمكنك أيضًا استخدام ResponseEntity ، على سبيل المثال.

@RequestMapping("/to-be-redirected")
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI yahoo = new URI("http://www.yahoo.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(yahoo);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}

وبالطبع ، أعد redirect:http://www.yahoo.com كما ذكر الآخرون.

48
matsev

النظر في التنفيذ الفعلي لـ UrlBasedViewResolver و RedirectView ستكون عملية إعادة التوجيه دائماً سياقياً إذا بدأ هدف إعادة التوجيه الخاص بك بـ /. لذا فإن إرسال //yahoo.com/path/to/resource لن يساعد في الحصول على إعادة توجيه نسبي للبروتوكول.

ولتحقيق ما تحاول أن تفعله مثل:

@RequestMapping(method = RequestMethod.POST)
public String processForm(HttpServletRequest request, LoginForm loginForm, 
                          BindingResult result, ModelMap model) 
{
    String redirectUrl = request.getScheme() + "://www.yahoo.com";
    return "redirect:" + redirectUrl;
}
45
daniel.eichten

هناك طريقة أخرى للقيام بذلك وهي استخدام الأسلوب sendRedirect:

@RequestMapping(
    value = "/",
    method = RequestMethod.GET)
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
    httpServletResponse.sendRedirect("https://Twitter.com");
}
20
Ivan Mushketyk

بالنسبة إلى عنوان url الخارجي ، يجب عليك استخدام " http://www.yahoo.com " كعنوان URL لإعادة التوجيه.

يتم شرح ذلك في إعادة التوجيه: بادئة من وثائق الربيع المرجعية.

إعادة توجيه:/اسم التطبيق/بعض/الموارد

سيتم إعادة التوجيه نسبة إلى سياق Servlet الحالي ، في حين أن اسمًا مثل

إعادة التوجيه: http://myhost.com/some/arbitrary/path

سيتم إعادة التوجيه إلى عنوان URL مطلق

8
sreeprasad

بالنسبة لي يعمل بشكل جيد:

@RequestMapping (value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Object> redirectToExternalUrl() throws URISyntaxException {
    URI uri = new URI("http://www.google.com");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setLocation(uri);
    return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER);
}
5
Lord Nighton

هل جربت إعادة توجيه حيث يمكنك توفير المعلمة السياق؟

3
Vijay Kukkala

يمكنك القيام بذلك بطريقة موجزة جدا باستخدام ResponseEntity مثل هذا:

  @GetMapping
  ResponseEntity<Void> redirect() {
    return ResponseEntity.status(HttpStatus.FOUND)
        .location(URI.create("http://www.yahoo.com"))
        .build();
  }
0
k13i