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

注解的原理

我们进去注解的类中看看

  1. @Target({ElementType.TYPE})表明该注解只能作用到
  2. @Retention(RetentionPolicy.RUNTIME)表明该注解生效时间段是RUNTIME
  3. @Documented表明该注解会生成文档

    这两个方法表明该注解跟Servlet的注解使用方法一样

web.xml的配置

我们在web目录下新建WEB-INF文件夹,并且在该文件夹下新建web.xml

同时把FilterDemo01的注解给注释掉,开始编写web.xml

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. 修改模板
  2. 一键生成
  3. 效果

过滤器执行流程

FilterDemo02.java

index.jsp

执行效果

因此,我们通常会这样使用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

    同时配置两个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配置: 谁定义在上边,谁先执行
发布了109 篇原创文章 · 获赞 2 · 访问量 1213

猜你喜欢

转载自blog.csdn.net/qq_42528769/article/details/104446512