SpringMVC拦截器详解
Springmvc的拦截器是一种类似于servlet过滤器的类,用于对控制器的预处理和后处理 来看源码:
package org.springframework.web.servlet; public interface HandlerInterceptor { boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
方法preHandle:用于对controller预处理,如判断是否登录,session过期检验,返回值为布尔型,为true就放行,为false就就拦截,需要用Reponse来进行响应;
方法postHandle:后处理回调方法,在controller方法执行之后,视图渲染之前执行,可以对模型数据和视图进行处理,ModelandView对象可以为null;
方法afterCompletion:请求处理完毕回调方法,在视图渲染完成之后执行,可以进行性能检测,输出消耗时间,类似于try-catch-finally中的finally,可以进行资源清理;
我们来编写一个拦截器来进行session过期检验:
public class sessionInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("执行了afterCompletion()方法"); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("执行了postHandle()方法"); } /** * 返回值表示,是否需要将当前请求拦截下来 * 第三个参数,是被拦截请求的目标对象 */ @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("执行了preHandle()方法"); HttpSession session = arg0.getSession(); //在进入web应用是将USer值传入session中,为null表示session超时,跳转到登录界面 if (session.getAttribute("USER")!=null) { return true; } System.out.println("session超时"); arg0.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(arg0, arg1); return false; } }
在SpringMVC.xml中配置拦截器:
<!-- 注册拦截器 --> <mvc:interceptors> <!-- session过期检查拦截器 --> <mvc:interceptor> <!-- 需要拦截的页面 --> <mvc:mapping path="/**"/><!-- 1、 /** 表示所有文件夹及里面的子文件夹 2、 /* 表示所有文件夹,不含子文件夹 3、 / 表示web项目的根目录 --> <!-- 不需要拦截的页面 --> <mvc:exclude-mapping path="/showLogin"/> <!-- 静态资源,不需要拦截 --> <mvc:exclude-mapping path="/static/**"/> <bean class="cn.hbmy.wxfw.intercept.sessionInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
mapping表示需要拦截的页面请求,exclude-mapping表示不需要拦截的页面,入登录界面和静态资源,最后,将拦截器类注入到框架中,这样对整个web应用进行检测,检测session是否过期