Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧&x2B;瓷砖。如何在控制器中返回301重定向(而不是302)_Java_Spring_Spring Mvc_Http Status Code 301_Tiles - Fatal编程技术网

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
对象