2026/1/10 8:04:47
网站建设
项目流程
铜陵市网站建设,泰安企业公司,wordpress插件原理,淘宝美工培训班过滤器和拦截器有什么区别#xff1f;
章节目录 文章目录过滤器和拦截器有什么区别#xff1f;实现过滤器和拦截器1.实现过滤器2.实现拦截器过滤器 VS 拦截器1.来源不同2.触发时机不同3.实现不同4.支持的项目类型不同5.使用的场景不同总结过滤器#xff08;Filter#xff…过滤器和拦截器有什么区别章节目录文章目录过滤器和拦截器有什么区别实现过滤器和拦截器1.实现过滤器2.实现拦截器过滤器 VS 拦截器1.来源不同2.触发时机不同3.实现不同4.支持的项目类型不同5.使用的场景不同总结过滤器Filter和拦截器Interceptor都是用于解决项目中与请求处理、响应管理和业务逻辑控制相关问题的工具但它们之间存在明显的区别。接下来我们将详细探讨这两者的不同之处。实现过滤器和拦截器1.实现过滤器过滤器可以使用 Servlet 3.0 提供的 WebFilter 注解配置过滤的 URL 规则然后再实现 Filter 接口重写接口中的 doFilter 方法。importjakarta.servlet.*;importjakarta.servlet.annotation.WebFilter;importjava.io.IOException;WebFilter(urlPatterns/*)publicclassTestFilterimplementsFilter{Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println(执行过滤器 init() 方法。);}OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{System.out.println(开始执行过滤器 doFilter() 方法。);// 请求放行filterChain.doFilter(servletRequest,servletResponse);System.out.println(结束执行过滤器 doFilter() 方法。);}Overridepublicvoiddestroy(){System.out.println(执行过滤器 destroy() 方法。);}}**void init(FilterConfig filterConfig)**容器启动初始化 Filter时会被调用整个程序运行期只会被调用一次。用于实现 Filter 对象的初始化**void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)**具体的过滤功能实现代码通过此方法对请求进行过滤处理其中 FilterChain 参数是用来调用下一个过滤器或执行下一个流程**void destroy()**用于 Filter 销毁前完成相关资源的回收工作。 b) 实现拦截器 拦截器的实现分为两步第一步创建一个普通的拦截器实现 HandlerInterceptor 接口并重写接口中的相关方法第二步将上一步创建的拦截器加入到 Spring Boot 的配置文件中。2.实现拦截器现 HandlerInterceptor 接口并重写 preHandle/postHandle/afterCompletion 方法。importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.stereotype.Component;importorg.springframework.web.servlet.HandlerInterceptor;importorg.springframework.web.servlet.ModelAndView;ComponentpublicclassTestInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(执行拦截器 preHandle() 方法。);returntrue;}OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(执行拦截器 postHandle() 方法。);}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(执行拦截器 afterCompletion() 方法。);}}**boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)**在请求方法执行前被调用也就是调用目标方法之前被调用。比如我们在操作数据之前先要验证用户的登录信息就可以在此方法中实现如果验证成功则返回 true继续执行数据操作业务否则就返回 false后续操作数据的业务就不会被执行了。**void postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView)**调用请求方法之后执行但它会在 DispatcherServlet 进行渲染视图之前被执行。**void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)**会在整个请求结束之后再执行也就是在 DispatcherServlet 渲染了对应的视图之后再执行。importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;ConfigurationpublicclassInterceptorConfigimplementsWebMvcConfigurer{// 注入拦截器AutowiredprivateTestInterceptortestInterceptor;OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(testInterceptor)// 添加拦截器.addPathPatterns(/**);// 拦截所有地址}}过滤器 VS 拦截器来源不同触发时机不同实现不同支持的项目类型不同使用的场景不同。1.来源不同过滤器来自于 Servlet而拦截器来自于 Spring 框架从上面代码中我们也可以看出过滤器在实现时导入的是 Servlet 相关的包如下图所示而拦截器在实现时导入的是 Spring 相关的包如下图所示2.触发时机不同请求的执行顺序是请求进入容器 进入过滤器 进入 Servlet 进入拦截器 执行控制器Controller如下图所示所以过滤器和拦截器的执行时机也是不同的过滤器会先执行然后才会执行拦截器最后才会进入真正的要调用的方法。3.实现不同过滤器是基于方法回调实现的我们在上面实现过滤器的时候就会发现当我们要执行下一个过滤器或下一个流程时需要调用 FilterChain 对象的 doFilter 方法进行回调执行如下图所示而拦截器是基于动态代理底层是反射实现的它的实现如下图所示代理调用的效果如下图所示4.支持的项目类型不同过滤器是 Servlet 规范中定义的所以过滤器要依赖 Servlet 容器它只能用在 Web 项目中而拦截器是 Spring 中的一个组件因此拦截器既可以用在 Web 项目中同时还可以用在 Application 或 Swing 程序中。5.使用的场景不同因为拦截器更接近业务系统所以拦截器主要用来实现项目中的业务判断的比如登录判断、权限判断、日志记录等业务。 而过滤器通常是用来实现通用功能过滤的比如敏感词过滤、字符集编码设置、响应数据压缩等功能。总结拦截器是基于java反射机制的而过滤器是基于函数回调。拦截器不依赖于Servlet容器而过滤器依赖于servlet容器。拦截器只能对action请求起作用而过滤器可以对几乎所以的请求起作用。拦截器可以访问action上下文值栈里的对象而过滤器不能。在Action的生命周期周拦截器可以被多次调用而过滤器只能在容器初始化的时候被调用一次。