Java Web之过滤器

1.过滤器的概念

过滤器是一个服务器端的组件,它可以拦截客户端的请求和响应信息,并对这些信息进行过滤。

注意:1. javaWeb三大组件:Filter、Servlet、Listener

   2. Filter 程序可以拦截 Jsp, Servlet, 静态图片文件和静态 html 文件。

Servlet API中提供了一个Filter接口,如果编写额类实现了这个接口,则称这个类为过滤器。Filter接口源码如下:

package javax.servlet;
import java.io.IOException;
public interface Filter {
    public void init(FilterConfig filterConfig) throws ServletException;
    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;
    public void destroy();
}

接口里有三个抽象方法,分别是init() 初始化  ,   doFilter()  执行过滤   和destory()销毁。

2. 过滤器的特点     请记住:一般处理方式是放行,转发

    1. 以常规方式调用资源(,调用servletJSP页面)

    2. 利用修改过的请求信息调用资源

    3. 调用资源,但在发送响应到客户机前对其进行修改,修改响应

扫描二维码关注公众号,回复: 5153198 查看本文章

    4. 阻止该资源调用,代之以转到其他的资源,返回一个特定状态代码或生成替换输出

    5. 阻止资源调用,不转到其它资源(错误的情况)

3. 过滤器的生命周期

Filter的创建和销毁由WEB服务器负责在启动tomcat的时候就行创建过滤器,并且执行init方法,完成对象的初始化。filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 每次拦截到都会去执行doFilter方法。

  1.  实例化———————————————–web.xml
  2.  初始化———————————————–init()
  3.  执行过滤——————————————–doFilter()
  4.  销毁————————————————–destory()

1.实例化,执行构造方法。 :在web.xml中对过滤器进行配置和映射,也可以使用注解@WebFilter。

2.初始化:web容器创建过滤器实例后将调用init方法,这个方法的参数FilterConfig对象可以获取web.xml文件中过滤器的初始化参数。在Filter的生命周期中,只会初始化一次。

3.执行过滤:当用户访问的URL与web.xml中url-pattern配置的值一样时,就触发这个过滤器,web容器会先调用过滤器,过滤器会调用doFilter方法,这个方法的参数FilterChain对象可以调用doFilter方法,将请求传给下一个过滤器(过滤器链的情况下)或目标资源,也可以利用重定向或转发的方式将请求转发到其他资源。在Filter的生命周期中,可以执行0到n次过滤。

4.销毁:web容器在销毁过滤器实例前调用这个方法(比如stop tomcat),在这个方法中可以释放过滤器占用的资源。在Filter的生命周期中,只会进行一次销毁。

    在web.xml中配置过滤器。这里要谨记一条原则:在web.xml中,监听器>过滤器>servlet。也就是说web.xml中监听器配置在过滤器之前,过滤器配置在servlet之前,否则会出错。

<!--配置过滤器--> 
<filter> 
    <filter-name>FilterTest</filter-name> 
    <filter-class>com.codeliu.FilterTest</filter-class> //类的全限定名(通过反射去创建这个过滤器对象)
    <init—param> //可选 
            <param—name>参数名</param-name>//过滤器初始化参数
            <param-value>参数值</param-value>  
    </init—pamm>  
</filter> 

<!--映射过滤器--> 
<filter-mapping> 
    <filter-name>FilterTest</filter-name>  
    <url-pattern>/*</url-pattern>
    <dispatcher>请求的类型</dispatcher> 
</filter-mapping>

在配置中需要注意的有三处:<filter-class>(类的全限定名(通过反射去创建这个过滤器对象)

             <url-pattren>要拦截的资源路径  

              <dispatcher>请求的类型

<url-pattren>一般有以下规则:

    1:作用与所有web资源:<url—pattern>/*</url-pattern>。则客户端请求访问任意资源文件时都要经过过滤器过滤,通过则访问文件,否则拦截。

    2:作用于某一文件夹下所有文件:<url—pattern>/dir/*</url-pattern>

    3:作用于某一种类型的文件:<url—pattern>*.扩展名</url-pattern>。比如<url—pattern>*.jsp</url-pattern>过滤所有对jsp文件的访问请求。

    4:作用于某一文件夹下某一类型文件:<url—pattern>/dir/*.扩展名</url-pattern>

   如果一个过滤器需要过滤多种文件,则可以配置多个<filter-mapping>,一个mapping定义一个url-pattern来定义过滤规则。

<filter>
      <filter-name>loginFilter</filter-name>
      <filter-class>com.ygj.control.loginFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>*.do</url-pattern>
  </filter-mapping>

 

<dispatcher>请求的类型,四个取值,分别为 REQUEST | INCLUDE | ORWARD | ERROR,不填时默认为 REQUEST。
  
  1. REQUEST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过请求转发(request.getRequestDisPatcher)的include方法或forward方法进行访问,那么该过滤器就不会被调用。
  2. INCLUDE:如果目标资源是通过request.getRequestDisPatcher的include方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
  3. FORWAED:如果目标资源是通过request.getRequestDisPatcher的forward方法进行访问,那么该过滤器将会被调用,其他情况下,不会被调用。
  4. ERROR:如果目标资源是通过声明或异常处理机制调用,那么该过滤器将会被调用,除此之外,不会被调用。
使用注解的方式
@WebFilter(urlPatterns = {"/*"},  
           initParams = {@WebInitParam(name = "noFilterPath", value = "login.jsp;LoginServlet;fail.jsp", description = "不触发该过滤器的页面"),
       @WebInitParam(name = "charset", value = "UTF-8")})
 
 
 
 

 

猜你喜欢

转载自www.cnblogs.com/gshao/p/10356047.html