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


问题内容

我尝试进行重定向301 Status Code(您知道我想对SEO友好,等等)。

我确实使用过,InternalResourceViewResolver所以我想使用某种类似于return "redirect:http://google.com"我的Controller 中的代码。这虽然会发送一个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的情况下实现它(尽管可能很好)。可能吗?

注意:包含的摘录只是详细信息控制器的一部分,并且重定向仅在某些情况下才发生(支持旧版URL)。


问题答案:

我建议像您一样使用spring的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");
    }