Servlet的过滤器跟监听器

Servlet的过滤器和监听器

过滤器

Servlet过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。

1. 过滤器在Web开发中的一些主要应用: 

1). 对用户请求进行统一认证;
2). 用户的访问进行记录和审核;
3). 对用户发送的数据进行过滤和替换;
4). 转换图像格式;
5). 对响应内容进行压缩,减少传输量;
6). 对请求和响应进行加解密处理。

 

2.过滤器的生命周期的各个阶段

1).实例化 ——Servlet容器创建Filter示例对象

2).初始化——调用init()方法,完成对象初始化功能,只执行一次

3).过滤——调用doFilter()方法,该方法定义过滤规则

4).销毁——调用destroy()方法销毁Fiter对象,释放过滤器的资源。

 

3.过滤器的实现

1).创建一个Servlet类来实现(implements)接口javax.servlet.Filter

2).实现init()方法,读取过滤器的初始化函数。init()方法是javax.servlet.Filter接口中定义的方法,这里通常只需要实现即可。

3).实现doFilter()方法,完成对请求或者过滤的响应。doFilter()方法是过滤器的核心方法,你希望过滤器在做什么事时,就是通过这个方法中来实现的。

4).调用FilterChain接口对象的doFilter()方法,向后续的过滤器传递请求或响应。当有下一个过滤器时, 则调用下一个过滤器,若无下一个过滤器,则将请求或者响应传递到目标。

5).在web.xml中配置Filter。只有配置了过滤器,这个过滤器才会起作用,不然就没有一个url来找到这个过滤器。

例如:要实现一个实现了javax.servlet.Filter接口的serlvet类——TestFilter类(包名为:cn.netjava.Servlet),对来自Test类的请求的过滤,来配置Filter,就要在web.xml中输入:

<filter>
	<filter-name>TestFilter</filter-name>
	<filter-class>cn.netjava.Servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>TestFilter</filter-name>
	<url-pattern>/Test<url-pattern>
</filter-mapping>

如果要实现对所有的请求的过滤,只要将<url-pattern>标签之间的Test改为*即可。

 

 

监听器

类似于Swing界面应用,Servlet也可以创建监听器,以对Servlet容器或者Servlet中对象的事件做出反应。在Servlet中定义了多种类型的监听器,他们用于监听的事件源分别为:session、request和application这三个对象中存取数据的变化。

Servlet监听器针对这三个对象上的操作,把这多种类型的监听器划分为三种类型

1.监听这三个对象创建和销毁的事件监听器

2.监听这三个对象中属性的增加和删除的时间监听器

3.监听绑定到session中的某个对象的状态的事件监听器

 

那么究竟要怎样实现Servlet监听器呢?

和编写所有的其他事件监听器一样,编写Servlet监听器也需要实现一个或者多个特定的监听器接口,并针对相应的动作来实现接口中相应的方法。 和其他事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由web容器负责注册,我们只需要在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源上。在web.xml中的配置:

<listener>
	<listener-class>cn.netjava.Servlet.TestListener</listener-clss>
</listener>

<listener-class>标签之间放置的是实现了监听器接口的Servlet类的位置,上面配置的是在cn.netjava.Servlet包下的TestListener类的监听器。只要编写好实现监听器接口的类,并配置好web.xml文件,就完成了Servlet监听器的编写。

l