• Java第四十二天,JavaWeb三大组件,Filter


    一、什么是Java Web三大组件

    Servlet、Filter(过滤器)、Listener(监听器)

    二、Filter 概念

    当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能

    三、Filter 使用

    1.自定义类,实现 Filter 接口

    2.设置拦截路径

    3.配置

    (1)web.xml 配置方式

    ① 自定义 Filter 类,实现 Filter 接口

    package web.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class FilterTest 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("我也拦截成功了......");
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    ② 配置 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_4_0.xsd"
             version="4.0">
    
        <!--配置 filter-->
        <filter>
            <filter-name>test</filter-name>
            <filter-class>web.filter.FilterTest</filter-class>
        </filter>
    
        <!--配置 filter 映射-->
        <filter-mapping>
            <!--选择配置好的 filter-->
            <filter-name>test</filter-name>
            <!--配置拦截路径-->
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>

    (2)注解 配置方式

    package web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    // 配置拦截路径, /* 表示全部拦截
    @WebFilter(urlPatterns = "/*")
    public class MyFilter 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("过滤中......");
            //放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    四、Filter 生命周期

    • init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次;用于加载资源
    • doFilter:每一次请求被拦截资源时,会执行;执行多次
    • destroy:在服务器关闭后,Filter对象被销毁;如果服务器是正常关闭,则会执行destroy方法;只执行一次。用于释放资源

    五、过滤器执行流程

    1. 执行过滤器
    2. 执行放行后的资源
    3. 回来执行过滤器放行代码下边的代码

    六、过滤器拦截路径配置

    • 具体资源路径 ===> /xxx.html 或其他
    • 目录拦截 ===> /xxx/*
    • 后缀名拦截 ===> *.jsp 或其他
    • 拦截所有 ===> /*

    七、过滤器拦截方式配置

    资源被访问的方式

    1.注解配置:

    设置 @WebFilter 注解的 dispatcherTypes 属性

    • REQUEST:默认值;浏览器直接请求资源
    • FORWARD:转发访问资源
    • INCLUDE:包含访问资源
    • ERROR:错误跳转资源
    • ASYNC:异步访问资源
    @WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.FORWARD)

    2.web.xml配置

    设置 web.xml 文件中 <dispatcher></dispatcher>标签即可

    <!--配置 filter-->
    <filter>
        <filter-name>test</filter-name>
        <filter-class>web.filter.FilterTest</filter-class>
    </filter>
    
    <!--配置 filter 映射-->
    <filter-mapping>
        <!--选择配置好的 filter-->
        <filter-name>test</filter-name>
        <!--配置拦截路径-->
        <url-pattern>/*</url-pattern>
        <!--配置过滤方式-->
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

    八、过滤器链

    即配置多个过滤器

    1.执行顺序

    如果有两个过滤器:过滤器1和过滤器2

    1. 过滤器1
    2. 过滤器2
    3. 资源执行
    4. 过滤器2
    5. 过滤器1

    2.过滤器先后顺序问题

    (1)注解配置

    按照类名的字符串比较规则比较,值小的先执行

    例如:

    AFilter 和 BFilter,AFilter就先执行了

    (2)web.xml配置

    <filter-mapping> 中,谁定义在上边,谁先执行

    作者:蓝月

    -------------------------------------------

    个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

  • 相关阅读:
    [LC] 347. Top K Frequent Elements
    [LC] 659. Split Array into Consecutive Subsequences
    [LC] 430. Flatten a Multilevel Doubly Linked List
    [LC] 271. Encode and Decode Strings
    [LC] 373. Find K Pairs with Smallest Sums
    [LC] 1048. Longest String Chain
    [LC] 297. Serialize and Deserialize Binary Tree
    ubuntu 创建 PyCharm 桌面快捷方式 (或者叫 启动器 )
    scala private 和 private[this] 的区别
    %s %r 区别 转
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573675.html
Copyright © 2020-2023  润新知