A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在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()这一行代码后面的代码被执行完,才能算完成。
流程如下图:

【转】https://blog.csdn.net/weixin_428 ... 346?utm_source=copy

2 个回复

正序浏览
回复 使用道具 举报
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马