从Spring MVC中的控制器操作重定向到外部URL

时间:2013-07-30 19:32:01

标签: java spring jsp spring-mvc

我注意到以下代码将用户重定向到项目内的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,无论它是否具有有效协议,并且不想重定向到视图。我怎么能这样做?

谢谢,

9 个答案:

答案 0 :(得分:163)

你可以用两种方式做到这一点。

首先:

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

答案 1 :(得分:48)

您可以使用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

答案 2 :(得分:45)

如果您的重定向目标以/开头,那么查看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;
}

答案 3 :(得分:20)

另一种方法是使用sendRedirect方法:

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

答案 4 :(得分:8)

对于外部网址,您必须使用“http://www.yahoo.com”作为重定向网址。

Spring的参考文档redirect: prefix中对此进行了解释。

  

重定向:/ MyApp的/一些/资源

将相对于当前的Servlet上下文重定向,而名称如

  

重定向:http://myhost.com/some/arbitrary/path

将重定向到绝对网址

答案 5 :(得分:5)

对我来说工作正常:

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

答案 6 :(得分:3)

您是否尝试过可以提供contextRelative参数的RedirectView

答案 7 :(得分:0)

您可以使用ResponseEntity这样简洁地完成此操作:

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

答案 8 :(得分:-1)

简而言之"redirect:yahoo.com""redirect://yahoo.com"会将您借给yahoo.com

"redirect:yahoo.com"将借给你your-context/yahoo.com,即前localhost:8080/yahoo.com