IT兄弟连 JavaWeb教程 过滤器1

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

过滤器

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

1  过滤器的定义

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

b233ef8127fe496a84965f1a9edd7426.png

图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>一一对应。

猜你喜欢

转载自www.cnblogs.com/itxdl/p/10954088.html
今日推荐