过滤器Filter的简单了解与模拟

目录

快速入门

什么是Filter

有什么作用

写一个demo快速上手(基于springboot)

思路分析:

代码实现

注意事项

 

Filter使用细节

执行流程图解

拦截路径

过滤器链

简单验证


快速入门

什么是Filter

Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。

有什么作用

可以拦截请求资源,实现业务逻辑,用于一些通用的操作,如日志输出,登录校验等

写一个demo快速上手(基于springboot)

思路分析:

1.定义一个类实现Filter接口,并重写所有方法

2.加上@WebFilter注解,用于指定拦截资源的路径

3.启动类上加上@ServletComponentScan(表示对Servlet组件支持)

代码实现

@WebFilter(urlPatterns = "/*") //配置过滤器要拦截的请求路径( /* 表示拦截浏览器的所有请求 )
public class DemoFilter implements Filter {
    @Override //初始化方法, 只调用一次
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init 初始化方法执行了");
    }

    @Override //拦截到请求之后调用, 调用多次
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo 拦截到了请求...放行前逻辑");
        //放行
        chain.doFilter(request,response);
    }

    @Override //销毁方法, 只调用一次
    public void destroy() {
        System.out.println("destroy 销毁方法执行了");
    }
}

1.对三种方法进行解析:init()方法是初始化方法,在web服务器启动的时候,就初始化了,会自动创建过滤器对象,这个方法只会调用一次

destroy()方法则是销毁方法,关闭web服务器的时候会被自动调用,也只会调用一次

doFilter()方法是需要重点掌握的方法,一般我们也只会重写这个方法,它是每次拦截到一次指定的请求都会被调用一次

2.当添加注解@WebFilter并指定属性urlPatterns 的时候,Filter才会真正的生效通过urlPatterns属性指定要拦截哪些请求

3.而对于SpringBoot工程,我们还必须在启动类上加@ServletComponentScan注解才可以使过滤器生效,通过这个@ServletComponentScan注解来开启SpringBoot项目对于Servlet组件的支持。

@ServletComponentScan
@SpringBootApplication
public class TliasWebManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(TliasWebManagementApplication.class, args);
    }

}
注意事项

在过滤器Filter中,如果不执行chain.doFilter(request, response)这个方法将无法访问后面的资源,这个一个放行操作


Filter使用细节

执行流程图解

当我们拦截到请求后我们会进入到过滤器的doFilter()方法,根据需要在这个方法中执行放行前的逻辑,和放行后的逻辑

  @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
        System.out.println("DemoFilter   放行前逻辑.....");//只是demo,具体写自己需要的代码逻辑

        //放行请求
        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("DemoFilter   放行后逻辑.....");//只是demo,具体写自己需要的代码逻辑
        
    }

拦截路径

1.拦截具体路径(urlPatterns值 /login)

2.拦截目录(urlPatterns值 /emps/*)

3.拦截所有(urlPatterns值 /*)

过滤器链

当我们有多个过滤器的时候,就会形成过滤器链,如下图

比如:我们在web服务器定义了两个或者以上的过滤器就会形成过滤器链,这两个过滤器会依次执行(执行顺序根据过滤器类名的首字母自然排序),会先执行第一个Filter,放行之后再来执行第二个Filter,如果执行到了最后一个过滤器放行之后,才会访问对应的web资源。

简单验证

在我们上面的过滤器模拟的基础上我们再写一个过滤器AbcFilter,体会一下过滤器链中的执行顺序

**AbcFilter过滤器**具体代码

@WebFilter(urlPatterns = "/*")
public class AbcFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Abc 拦截到了请求... 放行前逻辑");

        //放行
        chain.doFilter(request,response);

        System.out.println("Abc 拦截到了请求... 放行后逻辑");
    }
}

**DemoFilter过滤器**具体代码

@WebFilter(urlPatterns = "/*") 
public class DemoFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("DemoFilter   放行前逻辑.....");

        //放行请求
        filterChain.doFilter(servletRequest,servletResponse);

        System.out.println("DemoFilter   放行后逻辑.....");
    }
}

查看日志输出

注意:过滤器的执行顺序和类名有关系。以注解方式配置的Filter过滤器,它的执行优先级是按时过滤器类名的自动排序确定的,类名排名越靠前,优先级越高。

未完待续.........

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值