春天+瓷砖。如何在Controller中返回301重定向(而不是302)

时间:2014-12-24 20:48:33

标签: java spring spring-mvc http-status-code-301 tiles

我使用的代码如下:

@RequestMapping(value="/oldPath")
public String doProductOld(
    @PathVariable(value = "oldProductId") Long oldProductId,
   Model model
) throws Exception {
    Product product = productDao.findByOldId(oldProductId);

    return "redirect:" + product.getUrlNewPath();
 }

一切正常,但此重定向返回302响应代码,而不是SEO所需的301。如何轻松(没有ModelAndView或Http响应)更新它以返回301代码?

PS。我在ModelAndView对象从控制器返回时找到了解决方案,但在返回tiles alias(String)时需要Tiles的解决方案。

4 个答案:

答案 0 :(得分:5)

尝试为您的方法添加 @ResponseStatus 注释,请参阅下面的示例:

@ResponseStatus(HttpStatus.MOVED_PERMANENTLY/*this is 301*/)
@RequestMapping(value="/oldPath")
public String doProductOld(...) throws Exception {
    //...
    return "redirect:path";
}

答案 1 :(得分:4)

一般的想法是:

@RequestMapping(value="/oldPath")
public ModelAndView doProductOld(
    @PathVariable(value = "oldProductId") Long oldProductId,
   Model model
) throws Exception {
    Product product = productDao.findByOldId(oldProductId);
    RedirectView red = new RedirectView(product.getUrlNewPath(),true);
    red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
    return new ModelAndView(red);
 }

答案 2 :(得分:2)

有一种更新,更简单的方法,请在return "redirect:"...之前添加:

request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.MOVED_PERMANENTLY);

[sic]你必须在Request对象上设置属性。

答案 3 :(得分:0)

也可以在WebMvcConfigurer中完成:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addRedirectViewController("oldpath","newpath").setStatusCode(HttpStatus.MOVED_PERMANENTLY);
}