最近工作碰到了一个问题:
项目A需要收集项目B中的用户活跃数信息,最后通过HttpSessionAttributeListener实现。
在开发过程中,网上查找了过滤器、拦截器、监听器的帖子,这里对自己收集到的知识进行一下梳理。
下面将对他们三个,从概念、应用场景角度进行梳理。

1、过滤器(Filter)

(1)概念

  过滤器说白了,就是实现了javax.servlet.Filter接口的类。

  定义参考servlet api:

public interface Filter

A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.

(2)应用场景

  开发中主要用到的场景如下两个:

  场景一:用户登录及权限验证

    好多项目,会在Filter中过滤请求,判断用户是否拥有该请求的权限以及是否登录等。

    通常,用户登录之后,会将用户的基本信息、权限信息等,放入session中。

    之后,当用户访问某些请求,会从session中获取该用户权限进行比较,判断是否允许访问。

  场景二:请求响应内容处理

    Filter的doFilter方法中包含request和response两种参数,所以可以对请求、响应的内容进行处理,如:

    请求响应的字符编码

    响应的内容压缩等

  除上述之外,附上servlet api给出的描述

Examples that have been identified for this design are
1) Authentication Filters
2) Logging and Auditing Filters
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter

 

2、拦截器(Interceptor)

(1)概念

  与Filter相比,Interceptor更加侧重拦截。实现或继承了Interceptor的类,就是一个拦截器。

(2)应用场景

  拦截器用到最多的还是未登录拦截,当一个请求到服务器,发现该请求不合法,则跳转到错误页面。

  还有,相对于Filter来说,Interceptor可以注入Bean,所以,可以做更多的逻辑处理,这一点在开发过程中也很实用。

3、监听器(Listener)

(1)概念

  这里只说JavaWeb中使用到的Listener。在web应用中,Listener主要监听对象如下:

    ServletContext对象

    HttpSession对象

    ServletRequest对象

  监听方向有两类:

    对象的生命周期中的各个事件,如创建、销毁等。

    对象属性的创建和销毁。

(2)应用场景

  对Context对象监听,可以在项目启动中初始化某些组件,这些组件在项目启动、终止时进行一些逻辑操作。

  对Session对象监听,可以统计项目的访问人数,登录、活跃人数等。

  对Request对象监听,目前还没应用到,一般针对某些请求的操作,都优先考虑了Filter。

4、小结

  本文主要是对JavaWeb三大组件概念上的梳理,防止在开发过程中组件乱用,概念混淆。