概述
第1 部分 拦截器类
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。
Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:
1 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 2 throws Exception { 3 return true; 4 } 5 public void postHandle( 6 HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 7 throws Exception { 8 } 9 public void afterCompletion( 10 HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 11 throws Exception { 12 }
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
第2 部分 拦截器配置
如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。
基于注解的配置如下:
<mvc:interceptors> <bean class="com.Common.action.PurviewInterceptTest" /> </mvc:interceptors>
第3 部分 实例
/** * 拦截器测试 * * @ClassName: PurviewInterceptTest * @author xingle * @date 2015-3-6 下午12:02:08 */ public class PurviewInterceptTest extends HandlerInterceptorAdapter { private UrlPathHelper urlPathHelper = new UrlPathHelper(); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 获取访问url String url = urlPathHelper.getLookupPathForRequest(request); String queryString = urlPathHelper.getOriginatingQueryString(request); String redirectURL = url; if (!StringHelperTools.isEmpty(queryString)) { redirectURL = redirectURL + "?" + queryString; } if (true) {// 测试跳转到其他页面 response.sendRedirect(request.getContextPath() + "/Login1.html"); return true; } return super.preHandle(request, response, handler); } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, org.springframework.web.servlet.ModelAndView modelAndView) throws Exception { // 你自己的业务逻辑 //下面这句话不要动,就这样放着。你在处理你的业务逻辑之后,spring会将你的请求和响应继续往容器传或者往客户端进行传递 super.postHandle(request, response, handler, modelAndView); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 你自己的业务逻辑 //下面这句话不要动,就这样放着。你在处理你的业务逻辑之后,spring会将你的请求和响应继续往容器传或者往客户端进行传递 super.afterCompletion(request, response, handler, ex); } }