Java之Filter过滤器

简介

    filter过滤器主要使用于前台向后台传递数据的过滤操作。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

Filter工作原理

    过滤器可以有多个称之为过滤链FilterChain,服务器会按照web.xml中过滤器定义的先后循序执行。过滤器通过chain.doFilter()决定是否继续执行。 在过滤器中,可以拦截请求,判断请求是否满足过滤规则,对满足过滤规则的请求进行修改(如,统一设置编码格式)或者决定是否继续执行下面的操作(如,判断用户是否登录)。

Java之Filter过滤器_第1张图片

Filter使用步骤

1、新建一个类,实现javax.serlvet.filter接口

    Filter中有三个方法:

    A.void  init(FilterConfig config) //设置filter 的配置对象;

    b.void destory() //销毁filter对象;

    c.void doFilter(ServletRequestreq,ServletResponse res,FilterChain chain) //执行filter 的工作。

    doFilter方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。Filter通过调用chain.doFilter()将控制权传送给下一个过滤器,如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilter()方法时,将运行最初请求的Servlet。

2、在Web.xml中进行配置(配置和Servlet类似)

    配置标签:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><filter>

    <filter-name>myFilter</filter-name>         <!--Filter的名称-->

    <filter-class>***.MyFilter</filter-class>     <!--Filter的包路径-->

</filter>

<filter-mapping>

    <filter-name>myFilter</filter-name>  <!--此处的Filter名称和上面的一样-->

    <url-pattern>/*</url-pattern>      <!--指定拦截url匹配的资源-->

    <servlet-name>目标资源</servlet-name>        <!--指定拦截指定的servlet-->

    <dispatcher>REQUEST</dispatcher>             <!--指定过滤器所拦截的资源被 Servlet 容器调用的方式-->

</filter-mapping></span>

url-pattern标签详解:

    a、精确匹配,不用任何修饰符

      例如:<url-pattern>/servlet/TestServlet</url-pattern> 

    b、扩展匹配:*.扩展名

      例如:<url-pattern>*.jsp</url-pattern> 

    c、路径前缀匹配:目录/*

      例如:<url-pattern>/servlet/*</url-pattern> 

    d、全部匹配:/*

      例如:<url-pattern>/*</url-pattern>

Dispatcher标签详解:

    指定过滤器所拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多 个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
a、REQUEST:
    当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。
b、INCLUDE:
    如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
c、FORWARD:
    如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
d、ERROR:
    如若在A.jsp页面page指令中指定了error属性为examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。此功能类似error-page应用。

Filter使用场景

Filter的使用情况分为三种:
   1>
通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。如,用户权限限制。
   2>
通过在调用chain.doFilter方法之前,做些处理来达到某些目的。如,设置编码格式。
   3>
通过在调用chain.doFilter方法之后,做些处理来达到某些目的。如,对整个web网站进行压缩。

常用Filter代码分享


你可能感兴趣的:(java)