zoukankan      html  css  js  c++  java
  • 过滤器

    Java Web中的Servlet过滤器与自来水被过滤的原理相似。

    Servlet过滤器主要用于对客户端的请求进行过滤,并将过滤后的资源转交给下一资源。

    1、什么是Servlet过滤器
    如下图所示,Servlet过滤器具有拦截客户端请求的功能。

    Servlet过滤器可以改变请求中的内容,来满足实际开发的需求。

    不仅客户端发送的请求需要经过过滤器的处理,服务端返回的信息也需要经过过滤器。


    当一个过滤器不足以解决实际业务需求时,就需要部署多个过滤器对业务请求进行处理,这就形成了一个过滤器链。

    2、过滤器核心对象

    2.1 Filter接口

    每一个过滤器对象都需要直接或间接实现Filter接口。Filter对象实在doFilter方法中实现过滤操作的。

    每一个Filter对象都有一个FilterConfig对象,通过FilterConfig对象Filter对象可以获取它的初始化参数。

    每一个Filter对象也都有一个ServletContext的引用,通过这个引用,Filter对象可以加载它需要的资源。

    在Filter接口中定义了三个方法,如下图所示。

    2.2 FilterConfig接口
    FilterConfig接口由Servlet容器进行实现,主要用于获取过滤器中的配置信息。

    里面定义了四个方法。

    2.3 FilterChain接口
    Filter使用FilterChain调用过滤链中的一个Filetr(过滤器)。如果调用者是过滤链中的最后一个过滤器,那么就调用过滤链后的资源。

    在FilterChain接口中只定义了一个方法。

    3、过滤器的创建与实现
    创建过滤器需要创建一个类实现javax.servlet.Filter接口,同时实现Filter接口的3个方法。
    下面代码展示了如何创建过滤器。

    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class MyFilter implements Filter{
        //初始化方法
        public void init(FilterConfig filterConfig) throws ServletException{
        }
        
        //过滤处理方法
        public void doFilter(ServletRequest request,ServletResponse response,
            FilterChain chain) throws IOException,ServletException{
        }
        
        //销毁
        public void destroy(){
        }
    }

    过滤器中的init()方法用于对过滤器的初始化进行处理。

    destroy()方法是过滤器的销毁方法,主要用于释放资源,对于过滤处理的业务逻辑需要编写到doFilter()方法中。

    在请求过滤处理后,需要调用chain参数的doFilter()方法将请求向下传递给下一过滤器或目标资源。

    过滤器与Servlet十分相似,在创建之后同样需要对其进行配置。过滤器的配置主要分为两个步骤:
    1、声明过滤器对象
    2、创建过滤器映射

    下面是上面创建的Filter的配置文件

    <!-- 过滤器声明 -->
    <filter>
        <!-- 过滤器的名称 -->
        <filter-name>MyFilter</filter-name>
        <!-- 过滤器完整的类名 -->
        <filter-class>com.example.MyFilter</filter-class>
    </filter>
    <!-- 过滤器映射 -->
    <filter-mapping>
        <!-- 过滤器名称 -->
        <filter-name>MyFilter</filter-name>
        <!-- 过滤器URL映射 -->
        <url-pattern>/MyFilter</url-pattern>
    </filter-mapping>

    <filter>标签用于表明过滤器对象,在这个标签中必须配置两个子元素,分别为过滤器的名称和过滤器完整类名。

    其中<filter-name>用于定义过滤器的名称,<filter-class>用于指定过滤器的完整类名。

    <filter-mapping>标签用于创建过滤器的映射,它的抓哟作用是指定Web应用中,哪些URL应用哪一个过滤器进行处理。

    在<filter-mapping>中需要指定过滤器的名称和过滤器的URL映射。

    其中<filter-name>用于定义过滤器的名称,<url-pattern>用于指定过滤器应用的URL。

  • 相关阅读:
    English 2
    速算24点
    心理学1
    从微服务到函数式编程
    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
    033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
    032 01 Android 零基础入门 01 Java基础语法 03 Java运算符 12 运算符和if-else条件语句的综合案例——闰年问题
    031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
    030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
    029 01 Android 零基础入门 01 Java基础语法 03 Java运算符 09 逻辑“非”运算符
  • 原文地址:https://www.cnblogs.com/cuglkb/p/6670984.html
Copyright © 2011-2022 走看看