153

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

谢谢,

4

10 回答 10

251

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

第一的:

@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);
}
于 2013-07-31T03:57:05.397 回答
73

您可以使用RedirectView. 从JavaDoc复制:

重定向到绝对、上下文相对或当前请求相对 URL 的视图

例子:

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

您也可以使用 a 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正如其他人所说的那样返回。

于 2014-10-16T21:11:13.337 回答
52

查看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;
}
于 2013-08-01T11:57:59.533 回答
44

您可以使用以下方式以非常简洁的方式执行ResponseEntity此操作:

  @GetMapping
  ResponseEntity<Void> redirect() {
    return ResponseEntity.status(HttpStatus.FOUND)
        .location(URI.create("http://www.yahoo.com"))
        .build();
  }
于 2019-03-28T17:00:11.470 回答
33

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

@RequestMapping(
    value = "/",
    method = RequestMethod.GET)
public void redirectToTwitter(HttpServletResponse httpServletResponse) throws IOException {
    httpServletResponse.sendRedirect("https://twitter.com");
}
于 2015-10-01T21:41:19.173 回答
10

对我来说工作正常:

@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);
}
于 2015-05-30T08:19:25.953 回答
8

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

这在重定向: Spring 参考文档的前缀中进行了解释。

重定向:/myapp/some/resource

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

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

将重定向到绝对 URL

于 2013-07-30T20:38:53.340 回答
3

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

于 2013-07-30T20:54:54.383 回答
0

这对我有用,并解决了“对预检请求的响应未通过访问控制检查......”问题。

控制器

    RedirectView doRedirect(HttpServletRequest request){

        String orgUrl = request.getRequestURL()
        String redirectUrl = orgUrl.replaceAll(".*/test/","http://xxxx.com/test/")

        RedirectView redirectView = new RedirectView()
        redirectView.setUrl(redirectUrl)
        redirectView.setStatusCode(HttpStatus.TEMPORARY_REDIRECT)
        return redirectView
    }

并启用安全性

@EnableWebSecurity
class SecurityConfigurer extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable()
    }
}
于 2022-01-21T05:48:35.307 回答
-1

总之"redirect://yahoo.com"会借给你yahoo.com

哪里"redirect:yahoo.com"可以借给your-context/yahoo.comlocalhost:8080/yahoo.com

于 2017-05-27T06:20:53.983 回答