[Java 18_002] Filter 和 Interceptor

首先,在 JSP / Servlet 规范中,只定义了 Servlet,Filter,和 Listener;并没有定义 Interceptor。Interceptor 是某些 MVC 框架中的角色。

Servlet,Filter,Listener 定义在 web.xml 中;而 Interceptor 不在 web.xml 中定义,而是定义在框架的 context 配置文件中。

Servlet,Filter 和 Listener 的加载顺序和它们在 web.xml 中的配置顺序无关。另外在 web.xml 中还需要配置 context-param ,为 ServletContext 提供键值对,即应用上下文信息,其加载顺序也和在 web.xml 中的配置顺序无关。Servlet,Filter 和 Listener 可能会用到 上下文信息。所以,服务器启动后四者的加载顺序应为:

  • context-param → Listener → Filter → Servlet

另外,多个 Filter 的加载顺序和它们在 web.xml 中的配置顺序有关,web 容器按照它们的配置先后顺序进行初始化。当请求匹配多个 Filter 时,按照它们在 web.xml 的配置出现顺序依次调用 doFilter() 方法。

Filter

Filter 在 Java Servlet 2.3 规范中定义,基于函数回调,主要用于对请求进行预处理以及对响应进行后处理:

  • 在请求到达 Servlet 之前,Filter 先对请求进行拦截,对请求内容进行检查预处理(如编码转换、修改 HttpServletRequest 头和内容)。处理完后再把合法请求转发给 过滤链的下一个 Filter 或 Servlet,或者把非法请求丢弃掉,不再转发。
  • Servlet 对请求进行处理并生成响应结果。
  • 在响应返回给客户端之前,Filter可以再对响应进行拦截,对响应内容进行检查和后处理(如修改 HttpServletResponse 头和内容)。再返回给客户端。

Filter 相当于 Servlet的助手,处理对象主要是请求和响应。多个 Filter 可以协同工作,采用职责链的模式,一个 Filter 处理完请求后,调用下一个 Filter 来进行处理,各司其职,灵活组合。Filter 的先后顺序按照在 web.xml 中 Filter 出现的先后顺序。

创建 Filter 必须实现 javax.servlet.Filter 接口,需要在 web.xml 中配置 Filter。

Interceptor

Interceptor 是某些 MVC 框架的角色,是 AOP(Aspect Oriented Programming)思想的体现,在某些方法执行之前或之后进行拦截并进行处理,基于Java反射。

Filter 只能在 Servlet 之前或之后进行处理,而 Interceptor 可以深入到方法执行前后,异常抛出前后,对匹配拦截规则的多个方法起作用,在方法执行前、方法执行后都能进行处理。也可以阻止方法的执行。

拦截器可以将多个方法的最前和最后的通用的功能独立出来,供多个方法共享复用。当通用功能改变时,仅需要修改拦截器就行,大大减少了代码负担。

listener

listener是对事件进行监听和处理的角色,它采用观察者模式,只有当在这个listener上注册了的事件发生时,listener才会执行事件处理方法。这些事件举例:上下文(context)加载事件;session创建或销毁事件;容器、session或请求的属性设置或移除事件等。

Spring Interceptor

Spring Interceptor 的功能更为强大,是一个Spring的组件,归 Spring 管理,配置在 Spring 文件中,因此能使用 Spring 里的任何资源、对象,例如 Service 对象、数据源、事务管理等,通过 IoC 注入到拦截器即可;而 Filter 则不能。

Spring HandlerInterceptor 可以对 Handler 执行的前后进行处理,添加通用的预处理和后处理操作。有关 HandlerInterceptor(及其与 Filter 的比较)参见官方API文档

参考资料

[1] Servlet、Filter、Listener、Interceptor: http://blog.csdn.net/zuoluoboy/article/details/19750699
[2] 过滤器(Filter)和拦截器(Interceptor)的区别: http://blog.csdn.net/xiaodanjava/article/details/32125687
[3] Spring filter和拦截器(Interceptor)的区别和执行顺序: https://www.cnblogs.com/ycpanda/p/3637312.html
[4] HandlerInterceptor: https://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值