• Filter过滤器


    Filter过滤器

    过滤器是一个实现了javax.servlet.Filter接口的 Java 类, 可以配置多个

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

    可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。

    Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:

    • 在客户端的请求访问后端资源之前,拦截这些请求。
    • 在服务器的响应发送回客户端之前,处理这些响应。

    过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。

    当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。

    Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。

    Servlet 过滤器方法

    过滤器的类通常需要实现Filter接口

    javax.servlet.Filter 接口定义了三个方法:

    序号 方法及说明说明
    1 public void init(FilterConfig filterConfig)
    web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
    2 public void doFilter (request, response, chain)
    该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。
    chain用户访问后续过滤器。
    执行了request.doFilter(request, response); 才能通过, 不执行这句代码就会对请求进行拦截
    3 public void destroy()
    Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。(一次会话结束后调用, 也就是session失效后)

    过滤器方法的执行顺序: init -> doFilter -> destory()

    web.xml配置过滤器

    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>cn.test.MyFilter</filter-class>
        <!--init-param标签可不写-->
        <init-param> 
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    注意: <url-pattern>标签不能使用/*.do格式, 可以使用*.do格式

    常用标签配置说明:

    • <filter>指定一个过滤器。
      • <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
      • <filter-class>元素用于指定过滤器的完整的限定类名。
      • <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。
    • <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
      • <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
      • <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
    • <servlet-name>指定过滤器所拦截的Servlet名称。

    FilterConfig的使用

    FilterConfig是用来获取<init-param>标签中初始化的参数用的, 只能再init方法中使用FilterConfig

    如 web.xml 文件配置如下:

    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>cn.test.MyFilter</filter-class>
        <init-param> <!--设置初始化参数-->
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
    </filter>
    

    在 init 方法使用 FilterConfig 对象获取参数:

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 获取初始化参数
        String name = filterConfig.getInitParameter("name");
        // 输出初始化参数
        System.out.println(name);
    }
    

    过滤器案例

    1. 新建过滤器类

    在新建类cn.text.MyFilter 并实现Filter接口, 重写Filter接口的方法

    public class MyFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            String name = filterConfig.getInitParameter("name");
            System.out.println(name);
            String age = filterConfig.getInitParameter("age");
            System.out.println(age);
            System.out.println("init");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("doFilter");
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
            System.out.println("destroy");
        }
    }
    

    2. 配置web'xml

    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>cn.test.MyFilter</filter-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>张三</param-value>
        </init-param>
        <init-param>
            <param-name>age</param-name>
            <param-value>15</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    3. 任意写一个servlet

    代码略

    4. 请求servlet执行结果:

    张三
    15
    init
    doFilter
    

    当session超时或者关闭tomcat服务器的时候会再输出

    destroy
    
  • 相关阅读:
    .net批量插入SqlServer数据库的方法:
    Google主页中国元宵节
    左岸读书你是想读书,还是想读完书?
    Google主页中国著名教育家和画家 丰子恺先生 诞辰114周年
    【转载】图的遍历
    Google主页爱尔兰作家 布拉姆斯托克诞辰165周年
    诺基亚黯然关闭其在欧洲的最后一个手机工厂的背后
    [POJ 1012] Joseph(约瑟夫)
    台湾南投3.27地震
    左岸读书语不惊人死不休(95)
  • 原文地址:https://www.cnblogs.com/zpKang/p/13123768.html
Copyright © 2020-2023  润新知