欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Filter学习笔记(二) Filter的细节

程序员文章站 2024-03-24 13:33:40
...

注解的原理

我们进去注解的类中看看
Filter学习笔记(二) Filter的细节

  1. @Target({ElementType.TYPE})表明该注解只能作用到
  2. @Retention(RetentionPolicy.RUNTIME)表明该注解生效时间段是RUNTIME
  3. @Documented表明该注解会生成文档
    Filter学习笔记(二) Filter的细节
    这两个方法表明该注解跟Servlet的注解使用方法一样

web.xml的配置

我们在web目录下新建WEB-INF文件夹,并且在该文件夹下新建web.xml
Filter学习笔记(二) Filter的细节
同时把FilterDemo01的注解给注释掉,开始编写web.xml
Filter学习笔记(二) Filter的细节
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>FilterDemo01</filter-name>
        <filter-class>com.zzq.filter.FilterDemo01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo01</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

Filter代码模板

  1. 修改模板
    Filter学习笔记(二) Filter的细节
  2. 一键生成
    Filter学习笔记(二) Filter的细节
  3. 效果
    Filter学习笔记(二) Filter的细节

过滤器执行流程

FilterDemo02.java
Filter学习笔记(二) Filter的细节
index.jsp
Filter学习笔记(二) Filter的细节
执行效果
Filter学习笔记(二) Filter的细节
因此,我们通常会这样使用Filter,如下图:
Filter学习笔记(二) Filter的细节
执行流程
1.执行过滤器
2.执行放行后的资源
3.回来执行过滤器放行代码下边的代码

过滤器生命周期方法

@WebFilter("/*")
public class FilterDemo03 implements Filter {
    /**
     * 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destory方法,只执行一次。用于释放资源
     */
    @Override
    public void destroy() {
        System.out.println("destroy......");
    }

    /**
     * 每一次请求被拦截资源时会执行doFilter方法,会执行多次
     *
     * @param req
     * @param resp
     * @param chain
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("doFilter......");
        chain.doFilter(req, resp);
    }

    /**
     * 在服务器启动后,会创建Filter对象,然后调用init方法,只执行一次。用于加载资源
     *
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("init......");
    }
}

过滤器配置详情

  • 拦截路径配置
    1.具体资源路径:/index.jsp只有访问index.jsp资源时,过滤器才会被执行
    2.拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
    比如:
    配置一个拦截路径为**/user/servlet01**的Filter
    Filter学习笔记(二) Filter的细节
    同时配置两个Servlet
    注解分别为:@WebServlet("/user/Servlet01")@WebServlet("/user/Servlet02")
    只有当访问了Servlet01时才会执行过滤器
    3.后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
    4.拦截所有资源:/* 访问所有资源时,过滤器都会被执行
  • 拦截方式配置:资源被访问的方式
    使用注解配置:设置dispatcherTypes属性
    1.REQUEST:默认值。浏览器直接请求资源
    2.FORWARD:转发访问资源
    3.INCLUDE:包含访问资源
    4.ERROR:错误跳转资源
    5.ASYNC:异步访问资源
    当只配置一个值时,注解可以省略value,但是要配置多个值就不能省,如下:
//浏览器直接请求资源时,该过滤器会被执行
@WebFilter(value = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})

使用web.xml配置:设置**标签**即可

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

  • 执行顺序:如果有两个过滤器:过滤器1和过滤器2
    1.过滤器1
    2.过滤器2
    3.资源执行
    4.过滤器2
    5.过滤器1
  • 过滤器先后顺序问题
    1.注解配置:按照类名的字符串比较规则比较,值小的先执行
    如:AFilter 和 BFilter,AFilter就先执行了。
    2.web.xml配置: 谁定义在上边,谁先执行