基于 Java 的反射机制,属于面向切面编程 (AOP)的一种运用
实现步骤
(1)创建拦截器类:实现HandlerInterceptor
接口
preHandle()
拦截器开始postHandle()
拦截器结束afterCompletion
最后执行(无论是有异常都要执行)
执行顺序: 拦截器开始执行–> controller -->拦截器结束执行
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器2开始执行");
//false:表示不继续往后执行
//true:表示继续向后执行
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器2结束执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("无论是否有异常都要执行2~~");
}
}
(2)配置拦截器
拦截所有请求:
<mvc:interceptors>
<bean id="my" class="util.MyInterceptor"/>
</mvc:interceptors
拦截指定请求:
<mvc:interceptors>
<mvc:interceptor >
<mvc:mapping path="/请求名" />
<mvc:mapping path="/请求名" />
<bean id="my" class="util.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
实例:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/test13"/>
<bean class="com.xj0927.util.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
使用场景
- 日志记录 :记录请求信息的日志
- 权限检查,如登录检查
- 性能检测:检测方法的执行时间
拦截器 Interceptor 和过滤器 Filter 的区别
(1)过滤器
依赖于 servlet 容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改 HttpServletRequest 的一些参数,包括:过滤低俗文字、危险字符等。
(2)拦截器
依赖于 web 框架,在 SpringMVC中 就是依赖于 SpringMVC 框架。在实现上基于 Java 的反射机制,属于面向切面编程 (AOP)的一种运用。由于拦截器是基于 web 框架的调用,因此可以使用 Spring 的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller 生命周期之内可以多次调用。但是缺点是只能对 controller 请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
(3)执行顺序
过滤器:过滤器的运行是依赖于 servlet 容器的,跟 springmvc 等框架并没有关系。并且,多个过滤器的执行顺序跟 xml 文件中定义的先后关系有关
拦截器:对于多个拦截器它们之间的执行顺序跟在 SpringMVC 的配置文件中定义的先后顺序有关