Spring MVC의 컨트롤러 작업에서 외부 URL로 리디렉션


118

다음 코드가 사용자를 프로젝트 내부의 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로 리디렉션하고보기로 리디렉션하고 싶지 않습니다. 어떻게 할 수 있습니까?

감사,

답변:


208

두 가지 방법으로 할 수 있습니다.

먼저:

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

19
ModelAndView가 아닌 ​​String을 직접 반환하면 더 간단합니다.
daniel.eichten 2015 년

24
첫 번째 방법에서 반환 코드를 302로 설정해야하는 것 같습니다. 그렇지 않으면 서버가 코드 200 및 Location 헤더로 응답을 반환하여 제 경우에는 리디렉션을 일으키지 않습니다 (Firefox 41.0).
Ivan Mushketyk

외부 URL로 리디렉션하는 동안 쿠키를 추가 할 수도 있습니다.
Srikar

1
첫 번째 방법이 필요합니다@ResponseStatus(HttpStatus.FOUND)
lapkritinis

@Rinat Mukhamedgaliev이 ModelAndView ( "redirect :"+ projectUrl); 추가 된 것이 가치라면 어떤 열쇠가 기본값으로 사용됩니까?
JAVA

56

당신은을 사용할 수 있습니다 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다른 사람들이 언급 한대로 돌아 오십시오 .


RedirectView는 나를 위해 작동하는 유일한 것입니다!
James111

webshpere에서 Redirect View로 이상한 동작을하고 있습니다. [code] [27/04/17 13 : 45 : 55 : 385 CDT] 00001303 webapp E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E : [서블릿 오류]-[DispatcherPrincipal] : java.io.IOException : javax.servlet.http.HttpServletResponseWrapper의 mx.isban.security.components.SecOutputFilter $ WrapperRsSecured.sendRedirect (SecOutputFilter.java:234)에서 패턴이 허용되지 않습니다. sendRedirect (HttpServletResponseWrapper.java:145) [code]
Carlos de Luna Saenz

49

UrlBasedViewResolverRedirectView 의 실제 구현을 살펴보면 리디렉션 대상이 /로 시작하는 경우 리디렉션은 항상 contextRelative가됩니다. 따라서 //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;
}

그러나 이런 식으로 리디렉션은 GET입니까 아니면 POST로 유지됩니까? POST로 리디렉션하려면 어떻게합니까?
Accollativo

실제로 기본적으로 이것은 제공된 URL에 대해 GET을 발행해야 함을 의미하는 302를 반환합니다. 동일한 방법을 유지하는 리디렉션의 경우 다른 코드도 설정해야합니다 (HTTP / 1.1 기준 307). 그러나 보안 문제로 인해 다른 호스트 / 포트 조합을 사용하는 절대 주소에 반대하는 경우 브라우저가이를 차단할 것이라고 확신합니다.
daniel.eichten

26

이를 수행하는 또 다른 방법은 다음 sendRedirect방법 을 사용하는 것입니다.

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

22

다음 ResponseEntity과 같이 사용하여 매우 간결하게 할 수 있습니다 .

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

1
이것은 받아 들여진 대답이어야합니다. 설정 및 사용이 매우 쉽습니다.
cyberbit

9

나를 위해 잘 작동합니다.

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

이 방법은 우편 배달부에서도 작동하므로 RedirectView보다 낫다고 생각합니다.
mehdi mohammadi


3

contextRelative 매개 변수를 제공 할 수있는 RedirectView 를 사용해 보셨습니까 ?


이 매개 변수는 /웹앱 컨텍스트 와 관련 이 있는지 확인하기 위해 시작하거나 시작하지 않는 경로에 유용합니다 . 리디렉션 요청은 여전히 ​​동일한 호스트에 대한 것입니다.
Sotirios Delimanolis 2013

-2

한마디로 "redirect://yahoo.com"당신을 빌려 것입니다 yahoo.com.

같은 곳 "redirect:yahoo.com"빌려 것이다 당신은 your-context/yahoo.com전직을 위해 즉,localhost:8080/yahoo.com


두 솔루션 모두 "간략히"redirect : yahoo.com "대"여기서 "redirect : yahoo.com"이라는 동일한 명령을 사용하며 상대 URL 리디렉션 만 작동합니다.
partizanos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.