天天看点

[Servlet&JSP] 过滤器的使用过滤器的概念过滤器的实现

过滤器介于servlet之前,可拦截过滤浏览器对servlet的请求,也可以改变servlet对浏览器的响应。

像性能测量、用户验证、字符替换、压缩等需求,应该设计为独立的组件,随时可以添加到应用程序之中,也可以随时移除,而不用修改原有的程序。servlet/jsp提供了过滤器机制以实现这些组件服务,可视需求抽换过滤器或调整过滤器的顺序,也可以针对不同的url应用不同的过滤器,甚至在不同的servlet间请求转发或包括时应用过滤器。

在servlet/jsp中要实现过滤器,必须实现filter接口,并在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。filter接口有三个要实现的方法:

<code>init()</code>

<code>dofilter()</code>

<code>destroy()</code>

如果调用了filterchain的<code>dofilter()</code>方法,就会执行下一个过滤器,如果没有过滤器,就调用请求目标servlet的<code>service()</code>方法。如果因为某个情况(如用户没有通过验证)而没有调用filterchain的<code>dofilter()</code>方法,则请求就不会继续交给接下来的过滤器或目标servlet,这时就是所谓的拦截请求(从servlet的观点来看,它根本不知道浏览器发出了请求)。

以下实现一个简单的 性能测量过滤器,以记录请求与响应间的时间差,并了解servlet处理请求到响应所需花费的时间。

performancefilter.java:

web.xml中的设置:

在web.xml中 ,<code>&lt;/filter-mapping&gt;</code>可以使用<code>&lt;url-pattern&gt;</code>或者<code>&lt;servlet-name&gt;</code>来表示哪些url或servlet将应用此过滤器。如果想一次符合所有的servlet名称,则可以使用星号(<code>*</code>)。

如果在过滤器初始化时想要读取一些参数,则可以在<code>&lt;filter&gt;</code>标签中进行设置,如:

接着在init()方法中可以使用如下语句获得初始参数值:

触发过滤器的时机,默认是浏览器直接发出请求。如果是那些通过<code>requestdispatcher</code>的<code>forward()</code>或<code>include()</code>而来的请求,则可以在<code>web.xml</code>中设置<code>&lt;dispatcher&gt;</code>标签,指定那些请求转发类型可以通过过滤器。如果不设置<code>&lt;dispatcher&gt;</code>标签,则默认为<code>request</code>。<code>error</code>是指由容器处理异常而转发过来的请求可以触发过滤器。

如果有某个url或者servlet会应用多个过滤器,则根据<code>&lt;filter-mapping&gt;</code>在web.xml中出现的先后顺序,来决定触发器的执行顺序。