Servlet过滤器是从Servlet2.3规范开始新增的功能,并在Servlet2.4规范中得到增强,监听器可以监听到Web应用程序启动和关闭。创建过滤器和监听器需要继承相应接口,并对其进行配置。

过滤器

在现实生活中,自来水都是经过一层层过滤处理才达到食用标准的,每一层过滤都起到一种净化的作用。JavaWeb中的Servlet过滤器与自来水被过滤的原理相似,Servlet过滤器主要用于对客户端(浏览器)的请求进行过滤处理,现将过滤后的请求转交给下一个资源,它在JavaWeb开发中具有十分重要的作用。

1  过滤器的定义

Servlet过滤器与Servlet十分相似,但它具有拦截客户端(浏览器)请求的功能,Servlet过滤器可以改变请求中的内容来满足开发中的需要。对于程序开发人员而言,过滤器实质上就是在Web应用服务器上的一个Web应用组件,用于拦截客户端(浏览器)与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。过滤器的处理方式如图1所示。

图1  过滤器

从上图可以看出,在Web服务器中部署了过滤器后,不仅客户端发送的请求会经过过滤器的处理,而且请求在发送到目标资源处理以后,请求的回应信息也同样要经过过滤器。

过滤器对象放置在javax.servlet包中,其名称为Filter,它是一个接口。除这个接口外,与过滤器相关的对象还有FilterConfig对象与FilterChain对象,这两个对象也同样是接口对象,位于javax.servlet包中,分别为过滤器的配置对象与过滤器的传递工具。在实际开发中,定义过滤器对象只需要直接或间接地实现Filter接口即可。

Filter接口:

每一个过滤器对象都要直接或间接地实现Filter接口,在Filter接口中定义了3个方法,分别为init()方法,doFilter()方法和destroy()方法,其方法声明及说明如下:

●  public void init(FilterConfig config)throws ServletException

过滤器初始化方法,该方法在过滤器初始化时调用

●  public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)thrwos IOException,ServletException

对请求进行过滤处理

●  public void destroy()

销毁方法,以便释放资源

FilterConfig接口:

FilterConfig接口有Servlet容器进行实现,主要用于获取过滤器中的配置信息,其方法声明及说明如下:

●  public String getFilterName()

用于获取过滤器的名字

●  public ServletContext getServletContext()

获取Servlet上下文

●  public String getInitParameter(String name)

获取过滤器的初始化参数值

●  public Enumeration getInitParameterNames()

获取过滤器的所有初始化参数

FilterChain接口:

FilterChain接口仍然由Servlet容器进行实现,在这个接口中只有一个方法,其方法声明如下:

punlic void doFilter(ServletRequest request,ServletResponse response)throws IOException, ServletException

该方法用于将过滤后的请求传递给下一个过滤器,如果此过滤器已经是过滤器链中的最后一个过滤器,那么,请求将传送给目标资源。

2  过滤器实现步骤

创建一个过滤器对象需要实现javax.servlet.Filter接口,同时实现Filter接口的3个方法,下面的例子演示了过滤器的创建。

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

public class MyFilter implements Filter{

//初始化方法

public void init(FilterConfig fConfig)throws ServletException{

//初始化处理

}

public void doFilter(ServletRequest request,ServletResponse response,

FilterChain chain)throws IOException,ServletException{

//过滤处理

chain.doFilter(request,response);

}

public void destroy(){

//释放资源

}

}

过滤器中的init()方法用于对过滤器的初始化进行处理,destroy()方法是过滤器的销毁方法,用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中,在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一个过滤器或目标资源。

使用过滤器并不一定要将请求向下传递到下一个过滤器或目标资源,如果业务逻辑需要,也可以在过滤处理后,直接回应与客户端。

过滤器与Servlet十分相似,在创建之后同样需要对其在web.xml中进行配置,过滤器的配置主要分为两个步骤,分别为声明过滤器对象和创建过滤器映射。下面的代码演示过滤器的配置。

<filter>

<filter-name>MyFilter</filter-name>

<filter-class>com.xdl.filter.MyFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>MyFilter</filter-name>

<url-pattern>/MyFilter</url-pattern>

</filter-mapping>

<filter>标签用于声明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称与过滤器完整类名,其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名。

<filter-mapping>标签用于创建过滤器的映射,它的主要作用就是指定Web应用中,那些URL应用哪一个过滤器进行处理。在<filter-mapping>标签中需要指定过滤器的名称与过滤器的URL映射,其中<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL。

<filter>标签中的<filter-name>可以是自定义的名称,而<filter-mapping>标签中的<filter-name>是指定已经定义的过滤器的名称,它需要与<filter>标签中的<filter-name>一一对应。

IT兄弟连 JavaWeb教程 过滤器1的更多相关文章

  1. IT兄弟连 JavaWeb教程 过滤器3

    过滤器案例:字符编码过滤器 在JavaWeb程序开发中,由于Web容器内部所使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码现象. 图3  无字符编码过滤器 从上图可以看出 ...

  2. IT兄弟连 JavaWeb教程 过滤器与监听器经典面试题

    1.谈谈你对Servlet过滤器的理解 过滤器是Servlet2.3规范中定义的一种小型的.可插入的Web组件.用来拦截Servlet容器的请求和响应过程,以便查看.提取客户端和服务器之间正在交换的数 ...

  3. IT兄弟连 JavaWeb教程 过滤器2

    3  多个过滤器的执行顺序 如果一个Web应用中使用一个过滤器不能解决实际中的业务需要,那么可以部署多个过滤器对业务请求进行多次处理,这样做就组成了一个过滤器链.Web服务器在处理过滤器链时,将按过滤 ...

  4. IT兄弟连 JavaWeb教程 ServletContext对象

    ServletContext是Servlet与Servlet容器之间直接通信的接口.Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象.每个Web应用都有唯一的S ...

  5. IT兄弟连 JavaWeb教程 JSON和JSON字符串

    JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是易于阅读和解析.当客户端和服务器端需要交互大量数据时,使用JSON格式传输 ...

  6. IT兄弟连 JavaWeb教程 经典案例

    案例需求:编写一个jsp servlet程序,在login.jsp发起login.do登录请求,当输入的用户名是abc密码是123时,则判断是登录成功,其它暂时认为是登录失败.当用户登录成功时,将用户 ...

  7. IT兄弟连 JavaWeb教程 文件下载技术

    ●  列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...

  8. IT兄弟连 JavaWeb教程 文件上传技术

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...

  9. IT兄弟连 JavaWeb教程 监听器4

    感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...

随机推荐

  1. c#应用程序带参数运行

    有时候我们需要让软件带参数运行,使用参数控制软件的部分行为, C#默认窗口应用是不带参数的,不过在Main函数的参数手动加上就可以得到参数了. 举例如下: /// <summary> // ...

  2. Cortex-M3 Bit-Banding

    Cortex-M3 Bit-Banding 1. 概述 CM3的存储器系统支持所谓的"位带"(bit-band)操作. 通过它,实现了对单一bit的原子操作.位带操作仅适用于一些特 ...

  3. 同级别中枢重叠后的走势分类---walkspeed

    同级别走势的中枢震荡有重叠,即意味当下级别走势类型是不能延续啦.走势级别开始升级.根据走势分解定理,可知走势能划分出至少三段当下级别的走势类型. 有三段同级别完成的走势类型,就必须有三个同级别的中枢. ...

  4. Linux学习之路(二)文件处理命令之下

    分区格式化: 一块分区想要使用的话,要格式化.格式化主要有两个工作,1,把分区分成等大小的数据块,每个数据块一般为4KB.2在分区之前建一个分区表,给第一个文件建一行相关数据,在分区表里保存了它的io ...

  5. JavaScript多态

    function Master(){ //给动物喂食 this.feed=function(animal,food){ window.alert(animal.constructor); docume ...

  6. PHP按照比例随机

    有这样的需求,在打开链接的时候,随机(按照项目的某个属性的比例随机)跳转到指定的几个项目的某一个项目页面 比如项目A:80  项目B:20 那么跳转到项目A 的比例为80%,项目B的比例为20% 那么 ...

  7. 【thrift】vc中使用thrift中文字符串乱码问题解决

    问题描述: VC中使用Apache thrift时,如果字符串中包含中文,会出现乱码问题,这个问题的原因是由于thrift为了达到跨语言交互而使用了UTF-8格式发送字符串,这点对java或者C#不会 ...

  8. THUPC2019划水记

    虽然早就打不动了,虽然一个队友提前说好跑路了,还是两个人来玩了玩.最大的失误是没有开场打模拟题,然后就没骗到钱,还是要向某一心骗钱不顾排名的队伍学习.这次的模拟题超简单,很愉快地就打完了,也没调多久, ...

  9. ACM学习历程—Hihocoder 1178 计数(位运算 && set容器)(hihoCoder挑战赛12)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 Rowdark是一个邪恶的魔法师.在他阅读大巫术师Lich的传记时,他发现一类黑魔法来召唤远古生物,鱼丸. 魔法n能召 ...

  10. AtCoder Regular Contest 080 E:Young Maids

    题目传送门:https://arc080.contest.atcoder.jp/tasks/arc080_c 题目翻译 给你一个\(n\)的排列\(p\),一个空序列\(q\),你每次可以从\(p\) ...