过滤器链、过滤器链调用原理与顺序、过滤器配置细节、过滤器过滤类型

来源:互联网 发布:coc男王升级数据2017 编辑:程序博客网 时间:2024/06/05 04:23



过滤器链调用原理与顺序:

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法(放行)中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

根据在web.xml文件中的顺序还决定调用的顺序:和<filter-mapping>的配置先后顺序有关系.
在开发中:Servlet,Filter,Listener配置先后问题: 一般先配置Listener,再配置Filter,最后配置Servlet.


过滤器链代码测试:chain.doFilter(req, resp);//放行

AFilter:
public class AFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("开始Afilter");chain.doFilter(request, response);System.out.println("结束AFilter");}@Overridepublic void destroy() {}}


BFilter:
public class BFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("开始Bfilter");chain.doFilter(request, response);System.out.println("结束BFilter");}@Overridepublic void destroy() {}}
CFilter:

public class CFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("开始Cfilter");chain.doFilter(request, response);System.out.println("结束CFilter");}@Overridepublic void destroy() {}}
配置web.xml文件:
<filter> <filter-name>a</filter-name> <filter-class>cn.itsource._01_filterchain.AFilter</filter-class> </filter>  <filter> <filter-name>b</filter-name> <filter-class>cn.itsource._01_filterchain.BFilter</filter-class> </filter>  <filter> <filter-name>c</filter-name> <filter-class>cn.itsource._01_filterchain.CFilter</filter-class> </filter>  <filter-mapping> <filter-name>a</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>  <filter-mapping> <filter-name>b</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>  <filter-mapping> <filter-name>c</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

请求的顺序:开始Afilter——开始Bfilter——开始Cfilter       响应的顺序:结束CFilter——结束BFilter——结束AFilter

上面三个过滤器的执行流程:开始Afilter——开始Bfilter——开始Cfilter——结束CFilter——结束BFilter——结束AFilter



配置路径的细节:

a.精确拦截指定资源

<url-pattern>/hello</url-pattern>:当前Filter只对/hello这个资源做过滤.

b.拦截所有资源

<url-pattern>/*</url-pattern>:当前Filter对所有的请求做过滤.如字符编码

c.对部分资源进行拦截(以什么开头)

    <url-pattern>/system/*</url-pattern>:当前Filter 对/system/之后的请求做过滤.

     比如:/system/list,/system/edit,/system/delete如权限判断

d.对部分资源进行拦截(以什么结束)

<url-pattern>*.html</url-pattern>:当前Filter 对后缀是ejf的进行过滤。如假静态化


过滤器过滤类型选择:

过滤器默认过滤的类型是:request。要想过滤其它的需要在web.xml中配置

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWARD</dispatcher>


Filter默认情况下,就只能对一次请求做过滤.

    <dispatcher>REQUEST</dispatcher>

若需要对请求转发做过滤:

     <dispatcher>REQUEST</dispatcher>

<dispatcher>FORWARD</dispatcher>




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 注册公司没有房产证怎么办 公司不运营了怎么办 公司注销了账户怎么办 租户不变更地址怎么办 营业执照忘审了怎么办 工商营业执照年检过期怎么办 个体营业执照没有年报怎么办? 个体工商户一年没有申报怎么办 个体工商户逾期未申报怎么办 个体户没报税过怎么办 农业银行证书过期了怎么办 ca证书丢了怎么办 ca证书被锁怎么办 上个月忘记清卡怎么办 财务人员进入税务黑名单怎么办 社保本丢了怎么办 贷款车辆登记证书怎么办 发票薄丢了怎么办? 汽车发票丢了怎么办 税票弄丢了怎么办 交强险正本丢了怎么办 个体营业执照正本丢失怎么办 简易注销后税务怎么办 拒绝了日历邀请怎么办 老人走丢了怎么办 老人走丢找不到怎么办 没人给介绍对象怎么办 bate365账号被锁怎么办 qq号疑似被盗怎么办 不知道音乐名字怎么办 忘记支付宝登录怎么办 微信被老婆拉黑怎么办 微信群昵称改不了怎么办 微信号设置不了怎么办 修改微信号点不开怎么办 多屏设置失败怎么办 icould密码忘了怎么办 微信号换不了怎么办 微信号改不了怎么办? 无法设置微信号怎么办 公司改名后商标怎么办