过滤器(Filter)和拦截器(Interceptor)
过滤器(Filter)
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求进行过滤
它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
我们先来看一下Filter接口的内容吧
Filter接口有两个默认方法:
init() : 初始化拦截器
destroy() : 销毁拦截器,用于资源的回收
一个抽象方法:
doFilter() : 该方法有三个形参,分别是ServletRequest, ServletResponse和FilterChain.
每一次被拦截的请求都会调用该方法。该方法将容器的请求和响应作为参数传递进来, FilterChain 用来调用下一个 Filter
怎么使用过滤器?
有两个步骤:
1.编写过滤器类,实现Filter接口
1 2 3 4 5 6 7 8 9 10 11 12 | public class TestFilter extends Filter { @Override protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { //doFilter()前的代码是对用户请求进行预处理 System.out.println( "Before" ); //执行Filter链中的下一个Filter filterChain.doFilter(request, response); //doFilter()后的代码是对用户请求进行后处理 System.out.println( "After" ); } } |
2.在web.xml中,配置过滤器
1 2 3 4 5 6 7 8 9 | < filter > < description >测试过滤器</ description > < filter-name >TestFilter</ filter-name > < filter-class >com.test.filtes.TestFilter</ filter-class > </ filter > < filter-mapping > < filter-name >TestFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
拦截器(Interceptor)
拦截器(Interceptor)和Servlet无关,它依赖于Web框架,在SpringMVC中就依赖于SpringMVC框架,由SpringMVC框架实现.在Struts2中同理
在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用.
就是在action的前,后,甚至抛出异常时进行处理.比如动态代理就是拦截器的简单实现,
由于拦截器基于框架,所以在拦截器中,所有Spring的bean都可以操作,
SpringMVC的拦截器基于HandlerInterceptor接口来实现,所以只要实现HandlerInterceptor接口或者继承它的实现类,
就可以自定义拦截器.
下面是HandlerInterceptor接口
preHandle()是在action前执行的方法,返回true继续执行,返回false则结束请求
postHandle()是在当前请求处理之后,在DispatcherServlet进行视图渲染之前执行的方法
afterCompletion()是在视图渲染完成后(即整个请求结束之后),执行的方法,用来进行资源清理的操作
怎么使用拦截器
1.定义拦截器类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class BaseInterceptor implements HandlerInterceptor{ public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println( "Before..." ); return true ; } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println( "渲染试图前,action执行后..." ); } public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) System.out.println( "整个请求结束之后" ); } |
2.在SpringMVC配置文件中注册拦截器
1 2 3 4 5 6 7 8 9 10 | < mvc:interceptors > <!-- 如果直接配置bean,代表对所有请求都拦截 --> < bean name="baseInterceptor" class="com.scorpios.interceptor.BaseInterceptor" /> < mvc:interceptor > <!-- 对/test.html路径进行拦截 --> < mvc:mapping path="/test.html"/> <!-- 特定的拦截器 --> < bean class="com.scorpios.interceptor.TestInterceptor" /> </ mvc:interceptor > < mvc:interceptors /> |
过滤器和拦截器的区别
两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的
Filter应用场景:
在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等
Interceptor应用场景:
Filter能做的,Interceptor都能做,推荐使用拦截器.
过滤器和拦截器的执行顺序
Filter过滤请求的字符集编码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < filter > < description >字符集过滤器</ description > < filter-name >encodingFilter</ filter-name > < filter-class >org.springframework.web.filter.CharacterEncodingFilter</ filter-class > < init-param > < description >字符集编码</ description > < param-name >encoding</ param-name > < param-value >UTF-8</ param-value > </ init-param > </ filter > < filter-mapping > < filter-name >encodingFilter</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!