• Filter过滤器-JavaWeb三大组件之一


    Servlet、Filter、Listener是JavaWeb的三大组件,给Web开发提供了很大的便利。

    • 什么是Filter?

    Filter,过滤器。类似与生活中的净水器、空气净化器。

    JavaWeb中Filter的作用:当浏览器请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一下特殊的功能。例如:登录验证、统一编码处理、敏感字符过滤等。

    • Filter的基本使用

    (1)定义一个类,实现接口Filter。

    (2)实现Filter接口的方法

    (3)配置拦截路径。可以用web.xml进行配置;Servlet 3.0以后还可以用注解进行配置。

    示例1(注解配置):

    @WebFilter("/index.jsp")
    public class FilterDemo1 implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("过滤请求req的代码");
            filterChain.doFilter(servletRequest,servletResponse);    // 放行请求
            System.out.println("增强响应resp的代码");
        }
    
        @Override
        public void destroy() {
    
        }
    }

    示例2(web.xml配置):

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <filter>
            <filter-name>filter1</filter-name>
            <filter-class>com.chichung.web.filter.FilterDemo1</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>filter1</filter-name>
            <url-pattern>/index.jsp</url-pattern>
        </filter-mapping>
    </web-app>

    上面两个示例的输出结果都是:

    过滤请求req的代码
    index...
    增强响应resp的代码

    说明,Filter的执行顺序是:

    (1)执行过滤器放行代码上边的代码

    (2)执行放行代码 filterChain.doFilter(servletRequest,servletResponse)

    (3)执行放行后的资源 index.jsp

    (4)回来执行过滤器放行代码下边的代码

    所以Filter可以对请求对象进行过滤,还可以对响应对象进行功能上的增强,再返回给客户端。

    • 关于拦截的配置

    上面讲了一下两种配置拦截的两种方式。

    下面是拦截路径的几种方式:

    (1)具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行

    (2)拦截目录: /user/*    访问/user下的所有资源时,过滤器都会被执行

    (3)后缀名拦截: *.jsp        访问所有后缀名为jsp资源时,过滤器都会被执行

    (4)拦截所有资源:/*        访问所有资源时,过滤器都会被执行

    还有就是拦截方式的配置。什么是拦截方式呢?我们有些请求是直接访问jsp文件,有些请求是先访问Servlet,然后Servlet通过请求转发到到jsp显示。直接访问jsp文件我们可以用上面的示例代码解决,但是请求转发或者其他方式呢?

    * 注解配置:
                    * 设置dispatcherTypes属性
                        1. REQUEST:默认值。浏览器直接请求资源
                        2. FORWARD:转发访问资源
                        3. INCLUDE:包含访问资源
                        4. ERROR:错误跳转资源
                        5. ASYNC:异步访问资源
    * web.xml配置
                    * 设置<dispatcher></dispatcher>标签即可

    • 过滤器的生命周期

    Filter接口的三个方法:

    1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源

    2. doFilter:每一次请求被拦截资源时,会执行。执行多次

    3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

     

    • 过滤器链(配置多个过滤器)

    执行顺序:如果有两个过滤器:过滤器1和过滤器2
                1. 过滤器1
                2. 过滤器2
                3. 资源执行
                4. 过滤器2
                5. 过滤器1

    过滤器先后顺序问题:

    1. 注解配置:按照类名的字符串比较规则比较,值小的先执行。例如: AFilter 和 BFilter,AFilter就先执行了。

    2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行。

  • 相关阅读:
    openresty
    ATS 相关
    pandas
    flask
    ansible
    zipline
    bcolz
    数据分析 --- concat
    Go --- 基础使用
    Go --- 基础介绍
  • 原文地址:https://www.cnblogs.com/chichung/p/10352045.html
Copyright © 2020-2023  润新知