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

UrlBasedViewResolver 및 RedirectView 의 실제 구현을 살펴보면 리디렉션 대상이 /로 시작하는 경우 리디렉션은 항상 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.