Java Web之Listener&Filter

Listener(监听器)

Java Web中的监听器用于监听各种变化,例如服务器的创建与销毁(ServletContext),会话的创建与销毁(Session),请求的创建与销毁(Request),以上三个域属性的更改,移出,替换,还有JavaBean的状态改变例如钝化,活化,绑定,解除绑定,一共有3+3+2=8个监听器.

创建/销毁监听器

  • ServletContextListener
  • HttpSessionListener
  • ServletRequestListener

见名知意,分别用于监听三个对象的创建与销毁(两个方法)

属性改变监听器

  • ServletContextAttributeListener
  • HttpSessionAttributeListener
  • ServletRequestAttributeListener

见名知意,分别用于监听三个对象的属性的添加,移除,替换(三个方法)

JavaBean的监听

  • HttpSessionBindingListener
  • HttpSessionActivationListener

分别是(解)绑定监听和(活)钝化监听

钝化和活化是什么?

就是序列化和反序列化,服务器正常关机时,会自动的吧Session给序列化到文件中,此操作称为钝化,服务器开机就会反序列化到内存中,称为活化.

注意:

  1. Tomcat的钝化和活化需要在配置文件中打开.tomcat/conf/context.xml中配置
1
2
3
4
5
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
  1. JavaBean类需要实现HttpSessionActivationListener和Serializable接口

绑定和解绑定

三个域对象的setAttribute()方法表示绑定,removeAttribute()方法表示解绑,该监听器用于监听JavaBean的绑定和解绑

注意: JavaBean类需要实现HttpSessionBindingListener接口.

Filter(过滤器)

用户的请求可以通过过滤器来过滤,过滤器可以判断用户的请求的各种状态,然后进行一系列分辨,可以拦截也可以放行.

实现过程:

  1. 实现Filter接口,会有三个方法init(),destroy(),doFilter(),分别是:初始化时候调用,销毁时调用,有符合条件的请求过滤时调用.

  2. 配置Filter.

    • 注解方式
    • web.xml方式

    主要写过滤器的名字和选择过滤器的作用范围,url可以使用* 作为通配符来使用,还可以使用Servletname属性,表示该过滤器仅仅针对于该Servlet.

  3. 当有符合过滤条件的请求时,doFilter()方法会被调用.有多个过滤器时,请求会依次(根据web.xml的map顺序)通过每个过滤器,然而响应会与请求相反的通过每个过滤器,类似于Android的事件分发机制(分发与消费).

生命周期

Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。每次filter进行拦截的时候,都会执行doFilter的方法。当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。

FilterConfig

代表了Filter的配置,类似于ServletConfig,可以通过其获得ServletContext对象

重要的配置

  1. url-pattern 作用的范围
  2. servlet-name 拦截指定Servlet
  3. dispatch 默认为Request ,还可以设置为Forward(拦截转发) ,Include(拦截包含),Error(有错误时拦截).