【问题标题】:Spring + Tiles. How to return 301 redirect (instead of 302) in Controller弹簧+瓷砖。如何在控制器中返回 301 重定向(而不是 302)
【发布时间】:2015-02-22 21:00:02
【问题描述】:

我正在使用如下代码:

@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 的解决方案。

【问题讨论】:

  • 谢谢。但我不清楚我应该写什么到modelAndView.setViewName("myFoo.jsp"); 行......我需要重定向到控制器。其他问题 - 它在 localhost 上不起作用

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


【解决方案1】:

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

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

【讨论】:

  • 同样的问题 - http://localhost:8080/project/oldUrl 重定向到 http://localhost:8080/newUrl
【解决方案2】:

总体思路是:

@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);
 }

【讨论】:

  • 是的,有效的解决方案。但是这个解决方案在开发版本(localhost)上不能正常工作,例如:http://localhost:8080/project/oldUrl 重定向到http://localhost:8080/newUrl。你知道为什么会这样吗?
  • @Escander,RedirectView 构造函数的第二个参数是contextRelative,我猜你需要把它改成false
  • 看起来这是 FF 中的一些缓存问题。使用第二个参数true 可以正常工作。
【解决方案3】:

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

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

[原文如此] 你必须在 Request 对象上设置属性。

【讨论】:

  • request 对象来自哪个类?
  • javax.servlet.http.HttpServletRequest
【解决方案4】:

也可以在 WebMvcConfigurer 中完成:

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

【讨论】:

    猜你喜欢
    • 2012-02-04
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多