在我们日常的开发中 , 我们经常会用到Filter和Interceptor 。有时同一个功能 。Filter可以做 , Interceptor也可以做 。有时就需要考虑使用哪一个比较好 。这篇文章主要介绍一下,二者的区别和联系 。希望给大家进行选择的时候,提供一些帮助Filter 和 Interceptor 的区别Filter过滤器(Filter)是在请求进入Tomcat容器之后,请求进入Servlet之前执行 。Filter是Servlet规范规定的 , 只能用于web程序中 。
Interceptor拦截器(Interceptor)是在Servlet和Controller控制器之间执行 。Interceptor是SpringframeWork中规定的 。
![Filter Spring中过滤器和拦截器(Interceptor)的区别和联系](http://img.zhejianglong.com/231019/011H45L5-0.png)
文章插图
- Interceptor是基于java的反射机制的 , 而Filter是基于函数回调 。
- Interceptor不依赖与servlet容器 , Filter依赖与servlet容器 。
- Interceptor只能对action请求起作用 , 而Filter则可以对几乎所有的请求起作用 。
- Interceptor可以访问action上下文、值栈里的对象,而Filter不能访问 。
- Interceptor以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑 。拦截器可以获取ioc中的service bean实现业务逻辑 。
filter
需要要实现javax.servlet.Filter
.【Filter Spring中过滤器和拦截器(Interceptor)的区别和联系】
import javax.servlet.*;import java.io.IOException;public class Myfilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("Myfilter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("Myfilter doFilter before");filterChain.doFilter(servletRequest,servletResponse);System.out.println("Myfilter doFilter after");}@Overridepublic void destroy() {System.out.println("Myfilter destroy");}}
注册Filter在web.xml中<!-- 注册过滤器 --><filter><filter-name>myfilter</filter-name><filter-class>com.hardy.config.Myfilter</filter-class></filter><filter-mapping><filter-name>myfilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Interceptor的实现自己的Interceptor
需要要实现org.springframework.web.servlet.HandlerInterceptor
.import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然System.out.println("MyInterceptor preHandle");return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在处理过程中(Controller方法处理完之后DispatcherServlet进行视图的渲染之前)执行拦截System.out.println("MyInterceptor postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在DispatcherServlet进行视图的渲染后 返回前进行拦截System.out.println("MyInterceptor afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}}
注册Interceptor在spring的配置文件中(application.xml)<!-- 配置拦截器 --><mvc:interceptors><mvc:interceptor><!-- 拦截所有的mvc控制器(Controller) --><mvc:mapping path="/**"/><!-- 放行机制 指定对某个页面不进行拦截 --><!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 --><mvc:exclude-mapping path="/login"/><!-- 指定使用哪个拦截器 --><bean class="com.hardy.config.MyInterceptor"/></mvc:interceptor></mvc:interceptors>
推荐阅读
- 接入点apn移动4g怎么设置网络才会更稳定 中国移动4gapn接入点
- 二 SpringCloud - Eureka注册中心,feign远程调用,hystrix降级和熔断
- 其三 Gitea 1.18 功能前瞻:增强文本预览效果、继续扩展软件包注册中心、增强工单实用功能、完善了用户邀请机制和SEO
- 明日方舟BW
- 崩坏3圣痕柳柒怎么获取
- 路由器接猫的正确接法(中国移动光猫和路由器怎么连接)
- Pytorch模型量化
- java中的垃圾回收算法与垃圾回收器
- 二 【SSM】学习笔记——SpringMVC入门
- JUC中的AQS底层详细超详解