您当前的位置: 首页 >  Java

Java三大器之过滤器(Filter)的工作原理和代码演示

发布时间:2018-05-10 10:21:54 ,浏览量:0

一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等 一些高级功能。   Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter 技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,Filter接口源代码:
[java]  view plain  copy
  1. public abstract interface Filter{  
  2.     public abstract void init(FilterConfig paramFilterConfig) throws ServletException;  
  3.     public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain   
  4.         paramFilterChain) throws IOException, ServletException;  
  5.     public abstract void destroy();  
  6. }  
二、Filter是如何实现拦截的?(Filter的工作原理)   Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前, 都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:     调用目标资源之前,让一段代码执行。     是否调用目标资源(即是否让用户访问web资源)。     调用目标资源之后,让一段代码执行。   web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个 doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问, 否则web资源不会被访问。 三、Filter开发流程 3.1、Filter开发步骤 Filter开发分为2步:  * 编写java类实现Filter接口,并实现其doFilter方法。  * 在web.xml 文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。

过滤器范例:

[java]  view plain  copy
  1. import java.io.IOException;  
  2. import javax.servlet.Filter;  
  3. import javax.servlet.FilterChain;  
  4. import javax.servlet.FilterConfig;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.ServletRequest;  
  7. import javax.servlet.ServletResponse;  
  8. /** 
  9.  * @author yangcq 
  10.  * @description 过滤器Filter的工作原理 
  11.  */  
  12. public class FilterTest implements Filter{  
  13.   
  14.     public void destroy() {  
  15.         System.out.println("----Filter销毁----");  
  16.     }  
  17.   
  18.     public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {  
  19.         // 对request、response进行一些预处理  
  20.         request.setCharacterEncoding("UTF-8");  
  21.         response.setCharacterEncoding("UTF-8");  
  22.         response.setContentType("text/html;charset=UTF-8");  
  23.         System.out.println("----调用service之前执行一段代码----");  
  24.         filterChain.doFilter(request, response); // 执行目标资源,放行  
  25.         System.out.println("----调用service之后执行一段代码----");  
  26.     }  
  27.   
  28.     public void init(FilterConfig arg0) throws ServletException {  
  29.         System.out.println("----Filter初始化----");  
  30.     }  
  31. }  
在web. xml中配置过滤器:
[html]  view plain  copy
  1.   
  2.   <filter>  
  3.       <filter-name>FilterTest  
  4.   <filter-mapping>  
  5.       <filter-name>FilterTest  
  6.       <url-pattern>/* 
  7.                    
  8.                       FilterTest 
  9.                       name 
  10.                       gacl 
  11.                    
  12.                    
  13.                       配置FilterTest过滤器的初始化参数 
  14.                       like 
  15.                       java 
  16.                    
  17.              
  18.              
  19.               
  20.                   FilterDemo02 
  21.                    
  22.                   /* 
  23.               
  24.          */  
  25.         //得到过滤器的名字  
  26.         String filterName = filterConfig.getFilterName();  
  27.         //得到在web.xml文件中配置的初始化参数  
  28.         String initParam1 = filterConfig.getInitParameter("name");  
  29.         String initParam2 = filterConfig.getInitParameter("like");  
  30.         //返回过滤器的所有初始化参数的名字的枚举集合。  
  31.         Enumeration initParameterNames = filterConfig.getInitParameterNames();  
  32.           
  33.         System.out.println(filterName);  
  34.         System.out.println(initParam1);  
  35.         System.out.println(initParam2);  
  36.         while (initParameterNames.hasMoreElements()) {  
  37.             String paramName = (String) initParameterNames.nextElement();  
  38.             System.out.println(paramName);  
  39.         }  
  40.     }  
  41.   
  42.     @Override  
  43.     public void doFilter(ServletRequest request, ServletResponse response,  
  44.             FilterChain chain) throws IOException, ServletException {  
  45.         System.out.println("FilterDemo02执行前!!!");  
  46.         chain.doFilter(request, response);  //让目标资源执行,放行  
  47.         System.out.println("FilterDemo02执行后!!!");  
  48.     }  
  49.   
  50.     @Override  
  51.     public void destroy() {  
  52.         System.out.println("----过滤器销毁----");  
  53.     }  
  54. }  
六、Filter的部署时的一些参数的含义 Filter的部署分为两个步骤:   1、注册Filter   2、映射Filter 6.1、注册Filter   开发好Filter之后,需要在web.xml文件中进行注册,这样才能够被web服务器调用。在web.xml文件中注册Filter范例:
[html]  view plain  copy
  1. <filter>  
  2.     <description>过滤器名称  
  3.     <init-param>  
  4.         <description>配置过滤器的初始化参数        FilterTest            /*   元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径   子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字   设置 filter 所拦截的请求路径(过滤器关联的URL样式)   指定过滤器所拦截的Servlet名称。   指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个子元素用来指定 Filter 对资源的多种调用方式进行拦截。如下:    testFilter    /index.jsp    REQUEST    FORWARD  子元素可以设置的值及其意义:     REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问 时,那么该过滤器就不会被调用。     INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。     FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。     ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    108697博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.4851s