`
javasogo
  • 浏览: 1776092 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【转】关于Filter的若干

阅读更多
filter的执行顺序

一直没有仔细去研究下filter ,最近系统的测试了下:

先看代码吧

web.xml内容如下:

然后发布,发现打印的日志如下:

。。。

firstFilter init()...
secondFilter init()...

。。。

2008-10-23 11:36:43 org.apache.catalina.startup.Catalina start
信息: Server startup in 3665 ms

这里过滤器初始化好了。

当我们访问我们的 应用:http://127.0.0.1:8080/appName

发现打印日记如下:

before invoke secondFilter's chain.doFilter() ..
before invoke firstFilter's chain.doFilter() ..
after invoke firstFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

当我们将web.xml中filter的位置进行调整后:

然后在启动应用,会看到打印:

before invoke firstFilter's chain.doFilter() ..

before invoke secondFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..

after invoke firstFilter's chain.doFilter() ..

总结:

filter的执行顺序是按照web.xml中定义的顺序进行执行的(当多个filter都匹配的时候),执行顺序如下图表示。(PS图取自http://hi.baidu.com/cathy_200182/blog/item/1f686238df10eb22b8998fe3.html 感谢之)

出处:http://esteem.javaeye.com/blog/256894

FilterChain 执行过程

下面是一个避免提交数据乱码问题的EncodingFilter:

相应的web.xml为:

过滤控制访问权限的SecurityFilter:

相应的web.xml为:

EncodingFilter负责设置编码,SecurityFilter负责控制权限,那这两个过滤器是怎么起作用的呢?它们两个同时过滤一个请求时谁先谁后呢?

所有的奥秘就在Filter中的FilterChain中。服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的 doFilter()方法。执行的顺序就如上图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的 chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的 chain.doFilter()之后的代码,最后返回响应。

因此在07-02中执行的代码顺序是:

  1. 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");

  2. 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。

    如果用户已登录,则访问请求的资源:/admin/index.jsp。

    如果用户未登录,则页面重定向到:/failure.jsp。

  3. 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。

  4. 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。

过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。

出处:http://blog.csdn.net/wibnmo/archive/2009/10/22/4714227.aspx

分享到:
评论

相关推荐

    guided filter code

    guided filter MATLAB code(2013TPAMI) 包含若干examples,下载可用

    Python如何用filter函数筛选数据

    主要介绍了Python如何用filter函数筛选数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    论文研究-基于RSA的匿名双向认证若干技术的分析与设计 .pdf

    基于RSA的匿名双向认证若干技术的分析与设计,樊皓,,为了在一种节点易被入侵、破坏的环境下实现合法节点间安全地通信,本文综合公钥基础设施(PKI)、门限理论、Bloom Filter、分布式RSA参

    盐城工学院——多路抢答器设计

    盐城工学院电子设计,多路抢答器,代码加文档

    机器学习中特征选问题研究

    机器学习主要利用已知数据学习和推理其中未知的、潜在的概率分布的...然而,现有的 Filter特征选择算法存在这样的问题:要么选择出最具区分能力的若干特征作为最优特征子集,要么选择出区分能力较高且相互之间不冗余的

    matlab编写二元函数的计算代码-sigpro:西格普罗

    matlab编写二元函数的计算代码SIGPRO 概要 SIGPRO是一个信号处理功能库,旨在协助听觉研究软件的开发。...提供了测试程序来演示库中包含的功能的若干功能: tst_afd - test analog-filter design tst_cpx - tes

    Powershell小技巧–将文件夹中的大文件分成若干份

    朋友有一文件夹,全部是EML文件,约20G。...while( (dir -Path $scrfile -Filter *.eml ).count -gt 0) { #起始目录名为1 $directory++ #建立目录 New-Item -Path d:\$directory -ItemType Directory -Erro

    加权中值滤波函数,需要配合opencv

    加权均值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。所谓加权平均,使用这一术语是指用不同的系数乘以像素,即一些像素的权重比另一些...

    FPGA设计实现多功能数字钟

    在FPGA中设计实现一个多功能数字钟,具备以下功能: ...计时模块Timer_gen,数码管显示模块display,595控制模块hc595_ctrl,按键消抖模块key_filter,调时模块Adjust以及蜂鸣器控制模块buzzer。

    VBSCRIPT中文手册

    Filter 函数 根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。 FirstIndex 属性 返回字符串匹配的位置。 Fix 函数 返回数的整数部分。 For...Next 语句 以指定的次数重复一组语句。 For Each......

    vb Script参考文档

    Filter 函数 根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。 FirstIndex 属性 返回字符串匹配的位置。 Fix 函数 返回数的整数部分。 For...Next 语句 以指定的次数重复一组语句。 For Each......

    annotaction

    2. 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声 明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。 3. 可插性支持:熟悉 Struts2 的开发者一定...

    VBScript 语言参考

    Filter 函数 根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。 FirstIndex 属性 返回字符串匹配的位置。 Fix 函数 返回数的整数部分。 For...Next 语句 以指定的次数重复一组语句。 For Each......

    VBScript 语言参考中文手册CHM

    Filter 函数 根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。 FirstIndex 属性 返回字符串匹配的位置。 Fix 函数 返回数的整数部分。 For...Next 语句 以指定的次数重复一组语句。 For Each......

    VBSCRIP5 -ASP用法详解

    Filter 函数 根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。 FirstIndex 属性 返回字符串匹配的位置。 Fix 函数 返回数的整数部分。 For...Next 语句 以指定的次数重复一组语句。 For Each......

    web页面模块化异步渲染struts-gpipe.zip

    扣,struts-gpipe项目提供了将整个页面拆分成若干模块的功能,每一个模块都独立渲染,多个模块并发渲染,我们可以让一部分模块渲染完成之后先 返回给客户端,让另一部分模块渲染之后后返回给客户端,不用想,这样...

    wordpress获取文章标签函数:get_tag()

    查看get_term()后标签编号和对象都会被若干过滤器传递,并最终根据$filter参数值被审查。 【函数用法】 【参数】 $tag (整数 | 对象)(必需) 默认值:None $output (字符)(可选)常量OBJECT, ARRAY_A, 或 ...

    实验二- 网络数据包的监听与分析.doc

    1.设备要求:计算机若干台(装有Windows 2000/XP/2003操作系统、装有网卡),局域网环境,主机装有Wireshark工具。 2.每组1人,独立完成。 三 实验预备知识 1. Wireshark简介 Wireshark是一个开放源码的网络分析...

    java8源码-LearnSpring:学习springboot

    java8 ...Filter, Listener 可以不必声明在 xml 中,而是可以以类加注解的形式出现,这样 web.xml 就不是必须的了。 一是 WebApplicationInitializer 这个类,做了很多 web 容器初始化的工作。 sprin

    jpivot学习总结.doc

    从前面创建的若干个查询当中选择一个合适的查询(通过查询名称进行选择),例如: SELECT ... SELECT ... ... 它的属性比较简单,只有 id 和 queryName 两个,而且比较容易理解。 4.4. clickable ...

Global site tag (gtag.js) - Google Analytics