2013-07-30 17 views
66

zauważyłem następujący kod przekierowuje użytkownika do adresu URL wewnątrz projektu,Przekierowanie na zewnętrzny URL z akcji kontrolera w Spring MVC

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

natomiast, co następuje przekierowanie prawidłowo zgodnie z przeznaczeniem, ale wymaga http: // lub 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; 
    } 

Chcę przekierowanie zawsze przekierowanie do adresu URL określonego, czy to ma ważny protokół w nim, czy też nie i nie chcą, aby przekierować do widoku. Jak mogę to zrobić?

Dzięki,

Odpowiedz

117

Możesz to zrobić na dwa sposoby.

pierwsze:

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

drugie:

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

    } 
+15

Jest jeszcze prostsze, jeśli bezpośrednio zwrócisz łańcuch, a nie modelAndView. –

+17

Wygląda na to, że w pierwszej metodzie powinieneś ustawić kod powrotu na 302. W przeciwnym razie serwer zwróci odpowiedź z kodem 200 i nagłówkiem Lokalizacja, który nie spowoduje przekierowania w moim przypadku (Firefox 41.0). –

+0

Czy możemy również dodawać pliki cookie podczas przekierowania do zewnętrznego adresu URL. – Srikar

3

Czy próbowałeś RedirectView, gdzie możesz podać parametr contextRelative?

+0

Parametr ten jest przydatny dla ścieżek, które rozpoczynają się (lub nie) z '/', aby sprawdzić, czy powinien on być w stosunku do kontekstu webapp. Żądanie przekierowania będzie nadal dotyczyć tego samego hosta. –

37

Patrząc w faktycznej realizacji UrlBasedViewResolver i RedirectView przekierowanie zawsze będzie contextRelative jeśli cel przekierowania zaczyna się od /. Tak więc wysłanie //yahoo.com/path/to/resource nie pomogłoby uzyskać przekierowania względnego protokołu.

Tak, aby osiągnąć to, co staramy mógłby zrobić coś takiego:

@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; 
} 
+0

Ale w ten sposób przekierowanie jest GET lub czy pozostaje POST? Jak mogę przekierować jako POST? – Accollativo

+0

Tak naprawdę za domyślne jest zwrócenie 302, co oznacza, że ​​powinien wydać GET przeciwko podanego adresu URL. Aby przekierowanie zachowało tę samą metodę, powinieneś ustawić inny kod (307 od HTTP/1.1). Ale jestem prawie pewien, że przeglądarki zablokują to, jeśli będzie to działało pod bezwzględnym adresem przy użyciu innej kombinacji host/port z powodu problemów z bezpieczeństwem. –

34

Można użyć RedirectView. Skopiowane z JavaDoc:

widokiem, który przekierowuje do absolutnego, kontekst stosunku, lub w bieżącym wniosku względem URL

przykład:

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

Można również użyć ResponseEntity np

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

I oczywiście, powrót redirect:http://www.yahoo.com, jak wspomniano przez innych.

+0

RedirectView był jedynym, który wydawał się działać dla mnie! – James111

+0

Mam zmienny behavour wiwth Przekierowanie View, na webshpere otrzymuję: [kod] [27/04/17 13: 45: 55: 385 CDT] 00001303 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E [błąd de serwlet] - [DispatcherPrincipal] java.io.IOException: wzór niedozwolone \t w mx.isban.security.components.SecOutputFilter $ WrapperRsSecured.sendRedirect (SecOutputFilter.java:234) \t w javax. servlet.http.HttpServletResponseWrapper.sendRedirect (HttpServletResponse.java:145) [kod] –

4

Dla mnie działa bez zarzutu:

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

Innym sposobem, aby to zrobić jest po prostu użyć metody sendRedirect:

@RequestMapping(
    value = "/", 
    method = RequestMethod.GET) 
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException { 
    httpServletResponse.sendRedirect("https://twitter.com"); 
} 
-1

W krótkim "redirect:yahoo.com" lub "redirect://yahoo.com" pożyczy Ci yahoo.com.

gdzie jako "redirect:yahoo.com" pożyczy ci your-context/yahoo.com tj ex localhost:8080/yahoo.com

+0

oba rozwiązania mają tę samą komendę: "W skrócie" przekierowanie: yahoo.com "vs" gdzie jako "przekierowanie: yahoo.com", i działa tylko względne przekierowanie adresu URL. – partizanos

Powiązane problemy