过滤器链、过滤器链调用原理与顺序、过滤器配置细节、过滤器过滤类型
来源:互联网 发布: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() {}}
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>
阅读全文
0 0
- 过滤器链、过滤器链调用原理与顺序、过滤器配置细节、过滤器过滤类型
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- 过滤器
- LinuxC时间函数简介
- spring如何可以同时访问静态资源和Action
- 如何查询Oracle性能监控 该作者
- php storm 激活服务器链接
- vue 动态组件
- 过滤器链、过滤器链调用原理与顺序、过滤器配置细节、过滤器过滤类型
- android.carrierapi.cts.CarrierApiTest#testHasCarrierPrivileges
- hdu1691(静态字典树|对字符串进行排序)Phone List
- 算法题目---二叉搜索村的后序遍历序列
- textFiled 键盘遮挡问题
- Codeforces 208A
- 在DataTable中更新、删除数据
- 编程思想
- aidl文件import 报错; couldn't find import for class