1:写个自定义的拦截器。继承HandlerInterceptor
1 package com.ssm.interceptor; 2 3 import org.springframework.web.servlet.HandlerInterceptor; 4 import org.springframework.web.servlet.ModelAndView; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class MyInterceptor implements HandlerInterceptor { 10 11 /* 12 执行时机:会先到拦截器的preHandle方法。 13 这个方法是在目标方法前被执行。 14 return true 正常执行。 15 return false 如果是返回false的话,后续就不会执行了。 16 作用:会在这个方法中来做权限。日志,事务等的操作。 17 */ 18 public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 19 System.out.println("拦截器的preHandle方法"); 20 return true; 21 } 22 /* 23 执行时机:目标方法执行完,渲染视图前执行的这个方法。 24 作用:用来请求域中的属性或视图做出修改。 25 */ 26 public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 27 System.out.println("拦截器的postHandle方法"); 28 } 29 /* 30 执行时机:渲染视图之后。 31 作用:释放资源。 32 */ 33 34 public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { 35 System.out.println("拦截器的afterCompletion方法"); 36 } 37 }
然后在spring-mvc的xml文件中配置上。也就是放到spring的IOC中。
1 <mvc:interceptors> 2 <mvc:interceptor> 3 <!--在哪个路径下加上哪个拦截器--> 4 <mvc:mapping path="/emps"/> 5 <bean class="com.ssm.interceptor.SecondInterceptor"/> 6 </mvc:interceptor> 7 </mvc:interceptors>
常用场景
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
多个拦截器的执行顺序:
第一个拦截器return false:
后面的都不会执行。
第二个拦截器return false: