我使用的代码如下:
@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
的解决方案。
答案 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);
}