过滤器

过滤器概述

一个中间组件用于拦截源数据与目的数据之间的消息

过滤二者之间传递的数据

 

 

Web应用上的过滤器

驻留在Web服务器上的Web组件

过滤从客户端传递到服务器端的请求和响应

 

 

 

 

在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,他们并不需要知道过滤器的存在。

 

 

 

Web应用上部署多个过滤器

过滤器可以组成一个过滤器链。链中的每个过滤器负责特定的操作和任务,客户端的请求和响应在这些过滤器之间传递

 

 

 

过滤器的一些常见应用:

1:认证过滤:对用户请求进行统一的认证。

2:登录和审核过滤:对用户的访问请求进行记录和审核。

3:图像转换过滤:转换图像格式。

4:数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。

5:加密过滤:对请求和响应进行加密解密处理。

6:令牌过滤

7:资源访问触发事件过滤

8:XSLT过滤

9:MIME-type过滤

 

 

 

Filter – 编码、编译

所有的过滤器必须实现javax.servlet.Filter接口

 

 

 

代码与实现Servlet的代码类似

 

public class HelloWorldFilter implements Filter {

   private FilterConfig filterConfig;

   public void init(FilterConfig filterConfig)    {

      this.filterConfig = filterConfig;

   }

   public void doFilter( ServletRequest request, ServletResponse response,

                  FilterChain filterChain

                 ) throws ServletException, IOException   {

      PrintWriter pw = response.getWriter();

      ……

   }

   public void destroy()   {

   }

}

 

 

 

Filter – 部署

将编译好的class文件放置在Web应用程序的classes目录下

在部署文件web.xml中添加过滤器的注册与映射

 

<!—指定过滤器名和过滤器类-->

         <filter>

            <filter-name>HelloWorldFilter</filter-name>

            <filter-class>com.lovobook.HelloWorldFilter</filter-class>

         </filter>

         <!-- 将过滤器与URL模式关联-->

         <filter-mapping>

            <filter-name>HelloWorldFilter</filter-name>

            <url-pattern>/filter/*</url-pattern>

         </filter-mapping>

 

输入任意匹配/filter/*的URL,过滤器都会执行

 

过滤器API

由容器实现的接口

javax.servlet.Filter

javax.servlet.FilterChain

javax.servlet.FilterConfig

四个包装器类

javax.servlet.ServletRequestWrapper

javax.servlet.ServletResponseWrapper

javax.servlet.http.HttpServletRequestWrapper

javax.servlet.http.HttpServletResponseWrapper

 

注意:在请求送到过滤器链的下一个组件之前更改请求的内容或者改变从前一个组件接收的响应

 

Filter接口

方法

描述

void init(FilterConfig)

在应用程序启动时,由容器调用只执行一次

void doFilter(ServletRequest,ServletResponse, FilterChain)

对于每个URL映射到该过滤器的请求,

由容器调用该方法。

void destroy()

在应用程序关闭时,由容器调用。

 

filter接口是过滤器API的核心

 

doFilter()方法给过滤器对象一个机会来处理请求,转发请求到过滤器链中的下一个组件,或者自己回复客户端

 

过滤器的生命周期方法 ,过滤器API不提供Filter接口的任何实现 。自定义的过滤器必须明确地实现所有三个方法

 

 

 

 

FilterConfig接口

为过滤器提供初始化参数

由Servlet容器实现

可以使用ServletContext与Web应用程序的其它组件一起共享application中的属性

 

 

 

方法

描述

String getFilterName()

返回在部署描述文件中指定的过滤器的名称

String getInitParameter(String)

返回在部署描述文件中指定的参数的值

Enumeration getInitParameterNames()

返回在部署描述文件中指定的所有参数的名称。

ServletContext getServletContext()

返回Web应用程序的ServletContext。过滤器可以使用ServletContext设置、获取application范围内的属性

 

 

 

 

FilterChain接口

 

由容器实现

将请求传递到过滤器链的下一个组件

 

 

方法

描述

void doFilter(ServletRequest, 

             ServletResponse)

我们从一个过滤器对象的doFilter()方法中调用此方法,以继续过滤器链的传递过程。它会将控制转到链中的下一个组

 

 

 

 

 

配置Filter

<filter-mapping>元素

 

 

 

<filter>

      <filter-name>ValidatorFilter</filter-name>

      <description>Validates the requests</description>

      <filter-class>com.lovobook.filters.ValidatorFilter</filter-class>

      <init-param>

         <param-name>locale</param-name>

         <param-value>USA</param-value>

      </init-param>

   </filter>

servlet-name用于定义一个servlet名,所有对该servlet的访问都要被filter-name中定义的过滤器过滤

所有匹配到该URL定义的请求,都要被filter-name中定义的过滤器过滤

 

配置过滤器链

 

用多个过滤器处理在同一个请求

使用多个<filter-mapping>元素配置过滤器链

首先调用匹配请求URI的过滤器 <url-pattern>

再查找用Servlet名匹配请求URI的所有过滤器<servlet-name>  

过滤器的顺序按照它们在部署描述文件中出现的顺序排序  

 

容器会先调用匹配请求URI的过滤器,然后才是匹配servlet名的过滤器。因此,FilterB始终在FilterA之前调用

 

 

 

<filter-mapping>

      <filter-name>FilterA</filter-name>

      <servlet-name>RedServlet</servlet-name>

</filter-mapping>

<filter-mapping>

      <filter-name>FilterB</filter-name>

      <url-pattern>*.red</url-pattern>

</filter-mapping>

<servlet-mapping>

      <servlet-name>RedServlet</servlet-name>

      <url-pattern>*.red</url-pattern>

 </servlet-mapping>

 

 

 

使用请求和响应包装器

在请求送到过滤器链的下一个组件之前更改请求的内容

改变从前一个组件接收的响应

public class MyRequestWrapper extends HttpServletRequestWrapper {

 public MyRequestWrapper(HttpServletRequest req)  {

       super(req);

     }

     //重写接口方法

   ……

}

 

 

public class TextToHTMLFilter implements Filter {

     ……

     public void doFilter(ServletRequest request,ServletResponse response,  FilterChain filterChain) …{

        MyRequestWrapper mrw = new MyRequestWrapper (req);

         MyResponseWrapper mrsw = new MyResponseWrapper(res);

         filterChain.doFilter(mrw , mrsw );

    }

}

 

public class MyResponseWrapper extends HttpServletResponseWrapper {

public MyResponseWrapper(HttpServletResponse response)   {

      super(response);

   }

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值