zoukankan      html  css  js  c++  java
  • Java三大器之过滤器(Filter)的工作原理和代码演示

    一、Filter简介



      Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,

    Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等

    一些高级功能。

      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter

    技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,Filter接口源代码:

    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>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。

    过滤器范例:

    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中配置过滤器:
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="3.0"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
    7.   <display-name></display-name>      
    8.   <welcome-file-list>  
    9.     <welcome-file>index.jsp</welcome-file>  
    10.   </welcome-file-list>  
    11.   <!--配置过滤器-->  
    12.   <filter>  
    13.       <filter-name>FilterTest</filter-name>  
    14.       <filter-class>com.yangcq.filter.FilterTest</filter-class>  
    15.   </filter>  
    16.   <!--映射过滤器-->  
    17.   <filter-mapping>  
    18.       <filter-name>FilterTest</filter-name>  
    19.       <!--“/*”表示拦截所有的请求 -->  
    20.       <url-pattern>/*</url-pattern>  
    21.   </filter-mapping>  
    22. </web-app>  



    3.2、Filter链
      在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,
    决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter
    方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,
    如果没有,则调用目标资源。

    四,Spring框架下,过滤器的配置
        如果项目中使用了Spring框架,那么,很多过滤器都不用自己来写了,Spring为我们写好了一些常用的过滤器。下面我们就以字符编码的
    过滤器CharacterEncodingFilter为例,来看一下Spring框架下,如果配置过滤器。
    1. <filter>  
    2.     <filter-name>encodingFilter</filter-name>  
    3.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    4.     <init-param>  
    5.         <param-name>encoding</param-name>  
    6.         <param-value>UTF-8</param-value>  
    7.     </init-param>  
    8.     <init-param>  
    9.         <param-name>forceEncoding</param-name>  
    10.         <param-value>true</param-value>  
    11.     </init-param>  
    12. </filter>  
    13.   
    14. <filter-mapping>  
    15.     <filter-name>encodingFilter</filter-name>  
    16.     <url-pattern>/*</url-pattern>  
    17. </filter-mapping>  
  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/jpfss/p/8072706.html
Copyright © 2011-2022 走看看