JavaWeb

006_JavaWeb中的过滤器Filter的使用

2017-10-03  本文已影响30人  53b3f4658edc

Filter 简介

这里写图片描述

Filter 的基本工作原理

Filter 接口

FilterChain接口

FilterConfig 接口

过滤器的部署

< filter > 元素(注册Filter)

这里写图片描述

映射 Filter

这里写图片描述

测试代码

package com.mac.filter;

import java.io.IOException;

/*
 * Filter作用:
 *  Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能(请求和响应都能拦截)。
 */

/*
 *  Filter步骤:
 *      1.编写Filter类。
 *      2.配置web.xml文件中的Filter内容
 *      3.拦截(顺序取决于web.xml中的filter-mapping),然后处理。
 */

/*
 *  调用方法的时机:
 *  1.init方法:
 *      web应用程序启动的时候就调用该方法,注册该Filter,完成对该Filter的初始化操作,Filter实例是单例的。
 *  2.doFilter方法:
 *      每一次请求都会被调用
 * 3.destory方法:
 *      在该web应用程序被销毁的时候调用
 */

/*
 * public interface javax.servlet Filter
 * 过滤器是执行过滤任务的对象,这些任务是针对对某一资源(servlet 或静态内容)的请求或来自某一资源的响应执行的,抑或同时针对这两者执行。
 * Filter 用 doFilter 方法执行过滤。每个 Filter 都有对 FilterConfig 对象的访问权,可从该对象获得其初始化参数以及对它可以使用的 
 * ServletContext 的引用,以便为过滤任务加载所需的资源。
 * Filter 是在 Web 应用程序的部署描述符中配置的。
 * 已经标识用于此设计的示例是
 *  1) 验证过滤器 
 *  2) 日志记录和审计过滤器 
 *  3) 图像转换过滤器 
 *  4) 数据压缩过滤器 
 *  5) 加密过滤器 
 *  6) 标记过滤器 
 *  7) 触发资源访问事件的过滤器 
 *  8) XSL/T 过滤器 
 *  9) Mime 类型链过滤器 
 */
public class FilterServlet implements Filter {

        /*
        * public void   destroy()
        * 由 Web 容器调用,指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次,
        * 或者在过了超时期之后调用。在调用此方法之后,Web 容器不会再对此过滤器实例调用 doFilter 方法。 
        * 此方法为过滤器提供了一个清除持有的所有资源(比如内存、文件句柄和线程)的机会,并确保任何持久状态都
        * 与内存中该过滤器的当前状态保持同步。
        */
    @Override
    public void destroy() {
        System.out.println("destroy.....");
    }

    /*
    * public void   doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException
    * 每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许
    *  Filter 将请求和响应传递到链中的下一个实体。
    *  此方法的典型实现遵循以下模式:- 
    *   1. 检查请求
    *   2. 有选择地将带有自定义实现的请求对象包装到用于输入过滤的过滤器内容或头中 
    *   3. 有选择地将带有自定义实现的响应对象包装到用于输出过滤的过滤器内容或头中 
    *   4. a) 既可以使用 FilterChain 对象 (chain.doFilter()) 调用链中的下一个实体, 
    *   4. b) 也可以不将请求/响应对传递给过滤器链中的下一个实体,从而阻塞请求处理
    *   5. 在调用过滤器链中的下一个实体之后直接设置响应上的头。
    */
    //请求,响应,Filter链
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("doFilter......");
        //拦截的逻辑代码应该写在这,每次请求都会调用这个方法
        //这时候test.jsp的内容不会显示,因为被这里拦截了,但是没有过去
        
        /*
        * FilterChain:
        * FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。
        * 过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,
        * 则调用链末尾的资源。
        */
        /*
        * public void   doFilter(ServletRequest request, ServletResponse response) throws java.io.IOException, ServletException
        * 导致链中的下一个过滤器被调用,如果调用的过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。
        * request           沿着链传递的请求。
        * response      沿着链传递的响应。
        */
        //使用FilterChain对象(链),沿着链进行放行,这时候可以看到test.jsp的内容
        arg2.doFilter(arg0, arg1);

        //当去到的链完成之后,才会回来执行后面的代码
        //...

    }

    /*
    * public void   init(FilterConfig filterConfig) throws ServletException
    * 由 Web 容器调用,指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。
    * 在要求过滤器做任何过滤工作之前,init 方法必须成功完成。 
    * 如果 init 方法
    *   1.抛出 ServletException 
    *   2.没有在 Web 容器定义的时间段内返回
    * 则 Web 容器无法将过滤器放入服务中。
    */
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        /*
        * public interface javax.servlet    FilterConfig
        * servlet 容器使用的过滤器配置对象,该对象在初始化期间将信息传递给过滤器。
        */
        System.out.println("init......");
        
        //可以在web.xml中配置参数,在这里获得
        String value = arg0.getInitParameter("name");
        System.out.println(value);
    }

}
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="true" version="3.0">
    <!-- 注册Filter -->
    <filter>
        <filter-name>helloServlet</filter-name>
        <filter-class>com.mac.filter.FilterServlet</filter-class>       
        <init-param>
            <param-name>name</param-name>
            <param-value>value</param-value>
        </init-param>
    </filter>
    
    <!-- 映射Filter,这个顺序决定了同一资源拦截的顺序(Filter链) -->
    <filter-mapping>
        <filter-name>helloServlet</filter-name>
        <!-- 需要进行拦截的资源的路径(拦截根目录下的test.jsp),在访问该资源之前,Filter会进行拦截 -->
        <url-pattern>/test.jsp</url-pattern>
    </filter-mapping>

</web-app>

效果

init......
value
九月 30, 2017 5:24:20 下午 org.apache.catalina.startup.TldConfig execute
信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
九月 30, 2017 5:24:21 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-bio-8080"]
九月 30, 2017 5:24:21 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-bio-8009"]
九月 30, 2017 5:24:21 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 1522 ms
doFilter......

更多信息:www.itcourse.top

效果展示与源码下载:点击这里

欢迎加入讨论群:451826376

上一篇 下一篇

猜你喜欢

热点阅读