常见应用场景
日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录)
通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。 OpenSessionInView本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。
Spring拦截器和 过滤器 区别
XML配置文件对比
过滤器
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
拦截器
<!-- 拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器,顺序执行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" />
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器的拦截顺序
代码案例
创建Interceptor,实现:HandlerInterceptor接口
package com.springmvc.interceptor;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author : Eeerosss
* @create 2022/9/2 11:22
*/
public class MyInterceptor implements HandlerInterceptor {
Logger logger =Logger.getLogger(MyInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info("控制器处理之前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
logger.info("控制器处理完毕,视图执行之前执行");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.info("程序执行完毕,释放资源后执行");
}
}
特殊的拦截器
package com.springmvc.interceptor;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @Author : Eeerosss
* @create 2022/9/2 11:22
*/
public class MyInterceptor2 implements HandlerInterceptor {
Logger logger =Logger.getLogger(MyInterceptor2.class);
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
logger.info("只拦截User模块,控制器处理之前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
logger.info("只拦截User模块,控制器处理完毕,视图执行之前执行");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
logger.info("只拦截User模块,程序执行完毕,释放资源后执行");
}
}
配置文件
<!--拦截器配置文件-->
<mvc:interceptors>
<!--默认不写mapping,拦截所有-->
<bean class="com.springmvc.interceptor.MyInterceptor"></bean>
<mvc:interceptor>
<mvc:mapping path="/user/*action"/>
<bean class="com.springmvc.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
执行一个在user目录下的控制器的控制台信息
拦截顺序结果展示