Java 弹簧&x2B;瓷砖。如何在控制器中返回301重定向(而不是302)
我使用的代码如下:Java 弹簧&x2B;瓷砖。如何在控制器中返回301重定向(而不是302),java,spring,spring-mvc,http-status-code-301,tiles,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
@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
code
另外,我在从控制器返回model和view
对象时找到了解决方案,但在返回Tiles别名(字符串)时需要解决Tiles
。总体思路是:
@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);
}
尝试为您的方法添加@ResponseStatus注释,请参见下面的示例:
@ResponseStatus(HttpStatus.MOVED_PERMANENTLY/*this is 301*/)
@RequestMapping(value="/oldPath")
public String doProductOld(...) throws Exception {
//...
return "redirect:path";
}
也可以在WebMVCConfiguer中完成:
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("oldpath","newpath").setStatusCode(HttpStatus.MOVED_PERMANENTLY);
}
有一种更新、更简单的方法,在
返回“redirect:”…
之前添加:
request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.MOVED_PERMANENTLY);
[sic]您必须设置请求对象的属性。查看此问题并回答谢谢。但是我不清楚应该向
modelAndView.setViewName(“myFoo.jsp”)编写什么代码>行。。。我需要重定向到控制器。其他问题-它在LocalHost上不起作用是的,有效的解决方案。但是这个解决方案在dev版本(localhost)上无法正常工作,例如:http://localhost:8080/project/oldUrl
已重定向到http://localhost:8080/newUrl
。你知道为什么会这样吗?@Escander,RedirectView
construcor的第二个参数是一个contextRelative
,我想你需要将它更改为false
。看起来好像FF中存在缓存问题。第二个参数true
可以正常工作。同样的问题-http://localhost:8080/project/oldUrl
已重定向到http://localhost:8080/newUrl
哪个类是来自javax.servlet.http.HttpServletRequest的request
对象