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,
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);
}
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.
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;
}
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");
}
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
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);
}
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();
}
Haben Sie versucht RedirectView wo können Sie den Parameter contextRelative angeben?