在没有ModelAndView的Spring MVC 4中重定向301状态

时间:2015-02-25 17:46:30

标签: java spring spring-mvc

我尝试重定向301 Status Code(你知道我想成为SEO友好等)。

我确实使用InternalResourceViewResolver所以我想在我的Controller中使用某种与return "redirect:http://google.com"类似的代码。 这会发送302 Status Code

我尝试过使用HttpServletResponse设置标题

@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public String detail(@PathVariable String seo, HttpServletResponse response){
    response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    return "redirect:http://google.com";
}

它仍会返回302

在查看文档和Google搜索结果后,我们提出了以下建议:

@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public ModelAndView detail(@PathVariable String seo){
    RedirectView rv = new RedirectView();
    rv.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
    rv.setUrl("http://google.com");
    ModelAndView mv = new ModelAndView(rv);
    return mv;
}

它完全正常并且符合预期,返回代码301

我想在不使用ModelAndView的情况下实现它(尽管它可能非常好)。可能吗?

注意:包含的代码段只是详细信息控制器的一部分,重定向仅在某些情况下发生(支持旧版网址)。

3 个答案:

答案 0 :(得分:6)

不确定何时添加,但至少在v4.3.7上有效。您在REQUEST上设置了一个属性,弹出视图代码将其选中:

@RequestMapping(value="/url/{seo}", method = RequestMethod.GET)
public String detail(@PathVariable String seo, HttpServletRequest request){
    request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.MOVED_PERMANENTLY);
    return "redirect:http://google.com";
}

答案 1 :(得分:3)

我建议使用像你一样的弹簧redirectView。您必须有一个完整的URL,包括域等,以便它可以工作,否则它将执行302.或者如果您有权访问HttpServletResponse,那么您可以执行以下操作。

public void send301Redirect(HttpServletResponse response, String newUrl) {
        response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
        response.setHeader("Location", newUrl);
        response.setHeader("Connection", "close");
    }

答案 2 :(得分:2)

如果您已经返回ModelAndView并且不想使用HttpServletResponse,则可以使用此代码段:

Select sum(*) , groupterm from tble group by groupterm