您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
02-Filter-拦截路径配置&过滤器链(放行前后遵循先进后出原则)
发布时间:2024-12-08 22:31:33编辑:雪饮阅读()
-
除了上篇中WebFilter注解url为*以外,其实还有一些其它的匹配规则。
那么该注解同样对servlet的注解url也是可以进行过滤的。
这里再来了解其它几种过滤器规则。
拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截。(包含像是这样访问localhost:8080/FilterProjectModule/或localhost:8080/FilterProjectModule/index.jsp)
目录拦截:/user/*:访问/user下的所有资源,都会被拦截
后缀名拦截:*.jsp:访问后缀名为jsp的资源,都会被拦截
拦截所有:/*:访问所有资源,都会被拦截。(感觉效果和*其实是一样的)
过滤器链
过滤器链遵循先进后出原则,当前过滤器放行之前视为前,当前过滤器放行之后视为后,如下图
而对于过滤器Filter的优先级是按照过滤器的类名(字符串)的自然排序,例如:
AFilter、Filter1、Filter2这三个过滤器明显就是AFilter排第一,因为优先比对了第一个字母的时候已经知道了顺序,接下来才逐个比对后面的字母/数字
那么这三个过滤器假如WebFilter的url规则都是相同的如
@WebFilter("/*")
而不同的是他们的doFilter的实现不同。
则有如::
AFilter:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("hello World Filter A start");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("hello World Filter A end");
}
Filter1:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("--hello World Filter 1 start");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("--hello World Filter 1 end");
}
Filter2:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("----hello World Filter 2 start");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("----hello World Filter 2 end");
}
那么此时访问如:localhost:8080/FilterProjectModule/
有个小前提就是你的jsp页面如index.jsp中不包含任何控制台输出的情况下,则此时控制台输出则如:
hello World Filter A start
--hello World Filter 1 start
----hello World Filter 2 start
----hello World Filter 2 end
--hello World Filter 1 end
hello World Filter A end
很符合先进后出的原则。
关键字词:Filter,过滤器,过滤器链