转载

用Spring MVC优雅的实现301跳转

1. 问题

Spring MVC里面实现302跳转很简单,只需要如下写就可以。

  @RequestMapping(value = "/", method = RequestMethod.GET)     public String redirect(){         return "redirect:/home";     } 

那么如何处理301呢?查了很多资料,发现多数讲的是自己new 一个 RedirectView ,或者修改HttpResponse的header来实现。不但不好用,跟我们之前的风格也不一样,怎么办?

2. 原理

在Spring里,所有展示内容都是一个 View ,而 ViewResolver 则是决定使用哪个View进行处理的。处理的依据是viewName,处理的方式是依次调用所有的 ViewResolver ,直到返回不为null的结果为止。代码在 DispatcherServlet 中。

    protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,             HttpServletRequest request) throws Exception {          for (ViewResolver viewResolver : this.viewResolvers) {             View view = viewResolver.resolveViewName(viewName, locale);             if (view != null) {                 return view;             }         }         return null;     } 

3. 解决

所以解决方式就很简单了。可以通过自定义一个前缀"redirectPermanent",以及一个对应的 RedirectViewResolver 来处理301问题。 https://gist.github.com/code4craft/144cdc94464a2f5228219b5fe2864232 。前缀及语法可以自由定义。

  @RequestMapping(value = "/", method = RequestMethod.GET)     public String redirect(){         return "redirectPermanent:/home";     } 

至此,完工!

原文  http://piaoniu.io/yong-spring-mvcyou-ya-de-shi-xian-301tiao-zhuan/
正文到此结束
Loading...