自定义Filter及其工作原理

在Web开发中,某些资源的访问需要进行特定的过滤、拦截,这时我们就需要用到Filter。

自定义Filter,需要实现Filter接口,然后重写doFilter()方法,但是这个doFilter()方法里面的形参类型是ServletRequest 和 ServletResponse ,并不是HttpServletRequest 和 HttpServletResponse,因此让Filter实现类直接去实现原生的Filter接口这个方法并不是特别好,我们需要再定义一个HttpFilter基类,让Filter实现类去继承HttpFilter。

定义一个抽象类HttpFilter,实现Filter接口,声明一个抽象方法doMyFilter(),并在原生的doFilter()方法里,将ServletRequest 和 ServletResponse 转化成 HttpServletRequest 和 HttpServletResponse,调用doMyFilter()方法。这样,Filter的具体实现类,只需要直接继承HttpFilter基类,然后重写doMyFilter()方法即可。HttpFilter中的核心代码如下图:
在这里插入图片描述
当自定义具体的Filter实现类时,我们还需要在项目中的web.xml文件里面配置filter和filter-mapping,当多个Filter的filter-mapping中的url-pattern或者servlet-name相同时(即:多个Filter拦截同一个资源时),这些Filter就会组成一条Filter-Chain,就如同一条链一样,Filter一个扣着一个,按照顺序往下执行,而这个顺序就是filter-mapping的配置顺序。

在Filter-Chain中,第一个Filter执行doFilter()方法,直到执行到chain.doFilter()这行代码时,会进入到Filter-Chain中的第二个Filter中去执行它的doFilter()方法,直到执行到chain.doFilter()这行代码,又会进入到Filter-Chain中的第三个Filter……以此类推,一直到Filter-Chain中的最后一个Filter的doFilter()里面的chain.doFilter()代码被执行,才可以访问到filter-mapping中配置的url或是servlet。

而当url或是servlet资源被访问完后,又会回过头去执行Filter-Chain中最后一个Filter里面chain.doFilter()这一行代码后面的代码,然后执行倒数第二个Filter里面chain.doFilter()这一行代码后面的代码……以此类推,直到第一个Filter里面chain.doFilter()这一行代码后面的代码被执行完,才能算完成。

流程如下图:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值