Filter简介

l      Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

l      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:

Filter实现拦截的

l      Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:

•         调用目标资源之前,让一段代码执行

•         是否调用目标资源(即是否让用户访问web资源)。

•         web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。

•         调用目标资源之后,让一段代码执行

l      实验: Filter开发,见下页PPT中的开发流程

Filter开发入门

l      Filter开发分为二个步骤:

•        编写java类实现Filter接口,并实现其doFilter方法。

•        在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。(动手实验)

l      Filter链

•        在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

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

•        Filter链实验(查看filterChain API文档)

Servlet过滤器

l      需注意,Filter不是一个Servlet,它不能产生一个response,它能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理response。

l      将多个过滤器组成过滤器链,每个过滤器在应用程序中执行一个任务,这样有助于确保它们的模块性和复用性。

l       当Web容器收到一个请求时,将发生多个操作:

•        Web容器对请求执行自己的预处理。在这一步中发生的事情由容器供应商负责。

•        Web容器检查有没有与所请求的URL匹配的URL模式的过滤器。

•        Web容器使用一个匹配的URL模式定位第一个过滤器。执行该过滤器的代码。

•        如果还有其他具有匹配URL模式的过滤器,则执行其代码,持续该过程,直到不再有其他具有匹配URL模式的过滤器。

•        如果没有发生错误,则将请求传递到目标Servlet。

•        该Servlet将应答传回其调用者。应用到请求上的最后一个过滤器将成功为应用到应答上的第一个过滤器。

•        最初应用到请求上的第一个过滤器将应答传递给Web容器。

•        public voiddoFilter(ServletRequest req,ServletResponse res,FilterChain chain);是Filter中最核心的方法。

•        参数FilterChain类型的对象是保存多个过滤器执行顺序的对象。

Filter的生命周期

l       init(FilterConfig filterConfig)throws ServletException:

•        和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(注:filter对象只会创建一次,init方法也只会执行一次。示例 )

•        开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。(filterConfig对象见下页PPT)

l       destroy():

•        在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。

FilterConfig接口

l      用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:

•        String getFilterName():得到filter的名称。

•        String getInitParameter(Stringname): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.

•        EnumerationgetInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。

•        public ServletContextgetServletContext():返回Servlet上下文对象的引用。

l      实验:得到filter配置信息

Filter的部署—注册Filter

<filter><filter-name>testFitler</filter-name><filter-class>org.test.TestFiter</filter-class><init-param><param-name>word_file</param-name>   <param-value>/WEB-INF/word.txt</param-value></init-param>
</filter>

l      <filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。

l      <filter-class>元素用于指定过滤器的完整的限定类名。

l      <init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

Filter的部署—映射Filter

l      <filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

•        <filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字

•        <url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)

•        <servlet-name>指定过滤器所拦截的Servlet名称。

•        <dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

l      <dispatcher> 子元素可以设置的值及其意义:

•        REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

•        INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

•        FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

•        ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

Filter高级开发

l      由于开发人员在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。

Decorator设计模式

l      当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强:

•        编写子类,覆盖需增强的方法

•        使用Decorator设计模式对方法进行增强

l      疑问:在实际应用中遇到需增强对象的方法时,到底选用哪种方式呢?

•        没有具体的定式,不过有一种情况下,必须使用Decorator设计模式:即被增强的对象,开发人员只能得到它的对象,无法得到它的class文件。

•        比如request、response对象,开发人员之所以在servlet中能通过sun公司定义的HttpServletRequest\response接口去操作这些对象,是因为Tomcat服务器厂商编写了request、response接口的实现类。web服务器在调用servlet时,会用这些接口的实现类创建出对象,然后传递给servlet程序。

•        此种情况下,由于开发人员根本不知道服务器厂商编写的request、response接口的实现类是哪个?在程序中只能拿到服务器厂商提供的对象,因此就只能采用Decorator设计模式对这些对象进行增强。

l      Decorator设计模式的实现

•        1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。

•        2.在类中定义一个变量,变量类型即需增强对象的类型。

•        3.在类中定义一个构造函数,接收需增强的对象。

•        4.覆盖需增强的方法,编写增强的代码。

request对象的增强

l      Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper , (HttpServletRequestWrapper 类实现了request 接口中的所有方法,但这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法)以避免用户在对request对象进行增强时需要实现request接口中的所有方法。

2011级-csdn-java-张侃— 过滤器相关推荐

  1. 2011级-csdn-java-张侃—第十一周周报

    河软CSDN乐知学院 学员周学习总结 姓名 张侃 周次 11 方向 Java 内 容 本周学习知识点: EL表达式简介 面向对象的程序设计模式 自定义JSP标签 本周学习收获: EL表达式简介 EL表 ...

  2. 详解蚂蚁金服 SOFAJRaft:生产级高性能 Java 实现

    SOFAStack(Scalable Open Financial Architecture Stack) 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景 ...

  3. 阿里的26款大神级的Java开源项目

    1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务的 ...

  4. 浅谈2011年上半年Java游戏领域动态

    浅谈2011年上半年Java游戏领域动态 时间过得真快,转瞬已是 2011 年 6 月,仿佛都能听到 2012 正率领天启四骑士向我们快速冲锋的马蹄声了.所以趁着世界还没毁灭,我就先来谈谈 2011 ...

  5. 用c语言编程确定一个相图的截面,2011级本科C语言上机复习题.doc

    2011级 <C语言程序设计> 上机复习题 编写一个程序,调用printf函数在一行上输出您的姓名,再调用一次printf函数在两个单独的行上输出您的名和姓.输出应该如下所示(当然里面要换 ...

  6. 2011年度CSDN高校俱乐部“优秀主席”火热出炉

    2011年,CSDN高校俱乐部取得了骄人的成绩:举办全国高校巡讲.移动互联网应用创新大赛.星空大赛等技术活动100余场,覆盖全国高校50余所,辐射学生45000余人.活动效果获得了学校领导.老师和学生 ...

  7. 大学计算机基础郑州大学,郑州大学2011级《大学计算机基础》机试模拟考试安排日程表g.doc...

    各位同仁: 2011级<大学计算机基础>定于第17周(12月19日--23日)上机考试,有关要求如下: 学生所在院系为主监考,信工院为辅监考(负责机器正常运行和试卷抽取). 各院系派监考人 ...

  8. 14c语言课程设计题目,2011级数据库课程设计任务书

    2011级数据库课程设计任务书 [设计目的] 数据库课程设计是在学生系统地学习了<数据库系统原理>课程后,按照关系型数据库 的基本原理,综合运用所学的知识,设计开发一个小型的数据库管理信息 ...

  9. 个人对北理工2020级硕士研究生张××一篇学术论文涉嫌抄袭的看法

    日前,某网站上发布了关于北京理工大学2020级硕士研究生张××以署名第二作者的身份(共同一作)向arxiv上传了一篇学术论文涉嫌抄袭的消息. 处理结果 9月30日,北京理工大学研究生院网站发布< ...

最新文章

  1. Runtime.getRuntime().exec();里面产生停滞(阻塞,blocking)
  2. 干货|最全面的卷积神经网络入门教程
  3. Missing Data in Kernel PCA
  4. swust oj 962
  5. Spring 体系常用项目一览
  6. 关于阿里面试的的一个小题
  7. JZOJ__Day 10:【普及模拟】【USACO】横幅
  8. 今天,我种下了一朵小蓝花
  9. 如何通俗易懂地解释欧拉公式(e^πi+1=0)?
  10. downloader怎么用 hls_如何下载企业微信直播回放视频(HLS格式)
  11. 利用Oracle Enterprise Manager Cloud Control 12c创建DataGuard Standby
  12. tomcat-9.0.20部署的问题及性能监控
  13. 《Web测试囧事》——1.3 测试Web Service能否正常提供JSON数据
  14. Java 冒泡排序的使用
  15. java svg等值线_带有颜色填充的等值线画法研究
  16. ddr4 dqs 频率_ddr4
  17. (Rock, Paper, Scissors, Lizard and Spock)sheldon谢耳朵独创的剪刀,布,石头,蜥蜴,史波克 用代码实现
  18. 百度C++工程师的那些极限优化(内存篇)
  19. 请假时间计算方式java_java计算两段时间的重复天数
  20. Win7系统盘瘦身。

热门文章

  1. ffmpeg 编解码 码率设置问题 CBR 、VBR
  2. CBR ABR VBR
  3. 基于51单片机酒精浓度检测报警系统
  4. 5.pox.xml文件
  5. 52单片机 与 STM32 与 MSP430 与 流行单片机
  6. 怎样计算两个日期之间的天数
  7. 素因子分解算法python语言_[原创]magma,/PARI/GP中文文档ECC初步:
  8. CG动画制作项目第十一篇:后期剪辑以及音效、配音处理(一)
  9. php显示商品订货单,php – 在“订单”页面显示产品图片 – Woocommerce
  10. 量子计算机是3进制,量子计算有多快?二进制需要十万年的计算量子计算3分钟就能完成...