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

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

감사,



답변

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

먼저:

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


답변

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


답변

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


답변

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

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


답변

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

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


답변

나를 위해 잘 작동합니다.

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


답변

외부 URL의 경우 ” http://www.yahoo.com “을 리디렉션 URL로 사용해야 합니다.

이것은 Spring 참조 문서 의 redirect : prefix 에 설명되어 있습니다.

리디렉션 : / myapp / some / resource

현재 서블릿 컨텍스트를 기준으로 리디렉션되며 다음과 같은 이름은

리디렉션 : http://myhost.com/some/arbitrary/path

절대 URL로 리디렉션됩니다.