it-swarm.com.de

Umleiten zu einer externen URL von der Controller-Aktion in Spring MVC

Ich habe festgestellt, dass der folgende Code den Benutzer zu einer URL innerhalb des Projekts umleitet.

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

das Folgende leitet zwar ordnungsgemäß um, erfordert jedoch http: // oder 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;
    }

Ich möchte, dass die Umleitung immer zur angegebenen URL umleitet, unabhängig davon, ob ein gültiges Protokoll darin enthalten ist oder nicht, und ich möchte nicht zu einer Ansicht umleiten. Wie kann ich das machen?

Vielen Dank,

91
Jake

Sie können es auf zwei Arten tun.

Zuerst:

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

Zweite:

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

Sie können das RedirectView verwenden. Kopiert aus dem JavaDoc :

Diese Ansicht leitet zu einer absoluten, kontextbezogenen oder aktuellen anforderungsbezogenen URL weiter

Beispiel:

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

Sie können auch ein ResponseEntity verwenden, z.

@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);
}

Und natürlich zurück redirect:http://www.yahoo.com wie von anderen erwähnt.

50
matsev

Wenn Sie sich die tatsächliche Implementierung von rlBasedViewResolver und RedirectView ansehen, ist die Umleitung immer contextRelative, wenn Ihr Umleitungsziel mit/beginnt. Das Senden einer //yahoo.com/path/to/resource würde also nicht dazu beitragen, eine relative Protokollumleitung zu erhalten.

Um das zu erreichen, was Sie versuchen, können Sie Folgendes tun:

@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;
}
48
daniel.eichten

Eine andere Möglichkeit besteht darin, einfach die sendRedirect -Methode zu verwenden:

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

Für externe URLs müssen Sie " http://www.yahoo.com " als Weiterleitungs-URL verwenden.

Dies wird in Weiterleitung: Präfix der Spring-Referenzdokumentation erklärt.

umleiten:/myapp/some/resource

leitet relativ zum aktuellen Servlet-Kontext um, während ein Name wie

weiterleitung: http://myhost.com/some/arbitrary/path

leitet zu einer absoluten URL weiter

8
sreeprasad

Für mich funktioniert gut:

@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);
}
6
Lord Nighton

Mit ResponseEntity können Sie dies auf ziemlich prägnante Weise tun:

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

Haben Sie versucht RedirectView wo können Sie den Parameter contextRelative angeben?

3
Vijay Kukkala