过滤器、拦截器、监听器
经常使用过滤器和拦截器的小伙伴,应该也有和我一样的困惑,竟然拦截器可以实现拦截前、拦截后的处理;那么是不是意味着拦截器其实是可以替代过滤器的。毕竟过滤器只能拦截一次,而且是基于 Servlet 的,只能在 web 工程中使用。
什么是拦截器在 AOP 中用于在某个方法或字段被访问之前,进行拦截然后再之前货之后加入某些操作。拦截是 AOP 的一种实现策略。拦截器是动态拦截 Action 调用的对象。它提供了一种机制可以使开发者定义一个 action 前后执行的代码,也可以在一个 action 执行阻止其执行,同时也是提供了一种可以提取 action 可重用部分的方式。实现原理:大部分是通过代理的方式来调用的。
自定义拦截器步骤:自定义一个实现了 Interceptor 接口的类,或者继承抽象类 AbstractInterceptor。在配置文件中注册定义的拦截器。在需要使用 Action 中引入定义的拦截器,为了方便也可以把拦截器定义为默认的拦截器。所有的 Action 都会被这个拦截器拦截
什么是过滤器?过滤器是一个程序,他先于与之相关的 servlet 或 jsp 也可以运行在服务器上。过滤器可附加到一个或多个 servlet 或 jsp 页面上,并且可以检查进入这些资源的请求信息。以常规的方式调用资源利用修改过的请求信息调用资源调用资源,但在发送响应到客户机前对其进行修改阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
过滤器的基本原理:在 Servlet 作为过滤器使用时,他可以对客户的请求进行处理。处理完成后,他会交给下一个过滤器处理,这样,客户的请求在过滤器链中逐个处理,直到请求发送到目标为止。
拦截器与过滤器的区别
拦截器是基于 java 的反射机制的,而过滤器是基本函数回调。
拦截器不依赖于 servlet 容器,过滤器依赖于 servlet 容器拦截器只能对 action 请求起作用,
过滤器可以对几乎所有的请求起作用拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问在 action 的生命周期中,拦截器可以被多次调用,而过滤器只能在容器初始化时被调用过一次。
过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java 的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的 web 请求,这一点,是拦截器无法做到的。在 Java Web 中,你传入 request,response 提前过滤掉一些信息,或者提前设置一些参数,然后再传入 servlet 或者 struts 的 action 进行业务逻辑,比如过滤掉非法 url(不是 login.do 的地址请求,如果用户没有登陆都过滤掉),或者在传入 servlet 或者 struts 的 action 前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的,url 传来之后,检查之后,可保持原来的流程继续向下执行,被下一个 filter, servlet 接收。
监听器(Listener):Java 的监听器,也是系统级别的监听。监听器随 web 应用的启动而启动。Java 的监听器在 c/s 模式里面经常用到,它会对特定的事件产生产生一个处理。监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。又比如 struts2 可以用监听来启动。Servlet 监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
拦截器(Interceptor):java 里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。Java 中的拦截器是基于 Java 反射机制实现的,更准确的划分,应该是基于 JDK 实现的动态代理。它依赖于具体的接口,在运行期间动态生成字节码。拦截器是动态拦截 Action 调用的对象,它提供了一种机制可以使开发者在一个 Action 执行的前后执行一段代码,也可以在一个 Action 执行前阻止其执行,同时也提供了一种可以提取 Action 中可重用部分代码的方式。在 AOP 中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或者之后加入某些操作。java 的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2 等,有点类似面向切片的技术,在用之前先要在配置文件即 xml,文件里声明一段的那个东西。
评论