黑马程序员技术交流社区

标题: 【上海校区】自定义Filter及其工作原理 [打印本页]

作者: 不二晨    时间: 2018-10-8 11:04
标题: 【上海校区】自定义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()这一行代码后面的代码被执行完,才能算完成。
流程如下图:

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

作者: 不二晨    时间: 2018-10-10 11:40
奈斯
作者: 魔都黑马少年梦    时间: 2018-11-1 16:33





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2