zoukankan      html  css  js  c++  java
  • JavaWeb系列之:过滤器

    一,定义

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

    二,工作原理

    当web容器启动时,就从web容器加载过滤器(所以,只要web容器启动,那么过滤器就设置好了)。

    当用户发送请求,过滤器判断请求是否符合要求,如果符合就把用户请求发送Web资源。

    Web资源处理完请求信息,再把资源响应发送到过滤器。

    过滤器把Web资源的响应发送给用户。

    三,生命周期

    实例化  ------> 在web.xml中进行配置。当启动Web服务器时,会加载配置中的过滤器(实例化)。实例化只做一次,那就是在Web容器启时。

    初始化  ------>web容器启动后,就会进行初始化(调用init()方法),加载初始化信息。初始化只执行一次。

    过滤   ------>执行doFilter()方法。每次拦截请求时都会执行doFilter()方法。

    销毁   ------>在web容器关闭时,过滤器执行destory()方法进行销毁。

    四,实现一个过滤器

    1,过滤器方法

    init():这个是过滤器的初始方法,Web容器创建过滤实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。

    doFilter():这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器

          doFilter()方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源)。或利用转发,重定向将

          请求资源发送到其他资源。

    destory():Web容器在销毁过滤器实例之前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)

    2,自己实现一个过滤器

    public class FirstFilter implements Filter {
    
        @Override
        public void destroy() {
            System.out.println("destroy---FirstFilter");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("start----doFilter--FirstFilter");
            chain.doFilter(request, response);
        
            System.out.println("end------doFilter--FirstFilter");
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("init----FirstFilter");
        }
    
    
    }

    3,在web.xml中配置过滤器

        <filter>
            <filter-name>FirstFilter</filter-name>
            <filter-class>com.imooc.filter.FirstFilter</filter-class>
            <init-param>
                <param-name>name</param-name>
                <param-value>zhangsan</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>FirstFilter</filter-name>
            <url-pattern>/index.jsp</url-pattern> 
        </filter-mapping>

    五,过滤器链

    如果多个过滤器拦截的url没有交集的话。那么这多个过滤器是没有关系的。

    如果多个过滤器拦截的url有交集。那么这多个过滤器可以组成过滤器链。比如:

    用户请求 ------->  过滤器1 ------->过滤器2 ---------> 过滤器3 -------->web资源。

    服务端会按照web.xml中的过滤器定义的先后顺序组装成一条链。

    每个过滤器中都有doFilter()核心方法。在该方法中有放行方法: filterChain.doFilter()方法。

    在filterChain.doFilter()之前的代码会放行之前执行,在该方法之后的代码会在放行之后执行。

    六,过滤器分类

    1,Request(不指定,默认是这个):用户直接访问页面时,Web容器将会调用过滤器

    2,forward:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用。

      req.getRequestDispatcher("main.jsp").forward(request, response);

    3,include:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用

      req.getRequestDispatcher("main.jsp").include(request, response);

    4,error:目标资源是通过声明式异常处理机制调用时,过滤器将被调用

    <error-page>
        <error-code>404</error-code>
        <location>/error.jsp</location>
    </error-page>

    5,async(servlet3.0加入的):支持异步处理

    七,过滤器应用场景

    1,对用户请求进行统一认证

    2,编码转换

    3,对用户发送的数据进行过滤替换

    4,转换图像格式

    5,对响应的内容进行压缩

  • 相关阅读:
    sql 表连接
    easyui datagrid 列的内容超出所定义的列宽时,自动换行
    MySQL中函数CONCAT及GROUP_CONCAT
    第6章 Selenium2-Java 自动化测试模型
    第4章 Selenium2-java WebDriver API (三)
    第4章 Selenium2-java WebDriver API (二)
    第4章 Selenium2-java WebDriver API (一)
    第2章 Selenium2-java 测试环境搭建
    jsp导入外部样式
    第一章 Slenium2-Java 自动化测试基础
  • 原文地址:https://www.cnblogs.com/inspred/p/10865118.html
Copyright © 2011-2022 走看看