当前位置: 首页 > news >正文

过滤器与监听器知识总结

过滤器

什么是过滤器?

过滤器是servlet2.3规范中定义的一种小型的、可插入的Web组件。用来拦截Servlet容器的请求和响应过程。以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。

过滤器通常是封装了一些功能的Web组件,这些功能很重要,但对于处理客户端请求或发送响应来说不是决定性的。

典型的应用包括记录请求和响应的数据、管理会话属性等。

如何编写过滤器?

1.编写一个java类,实现Filter接口

--  过滤器API中有3个常用的接口,位于javax,Servlet包中:Filter,FilterChain,FilterConfig

     编程中,过滤器类要实现Filter接口,该接口中包含三个必须实现的方法:

     void init(FilterConfig  filterConfig);

     void doFilter(ServletRequest  request,ServletResponse  response,FilterChain  chain);

     void  destroy();

2.在doFilter方法中实现拦截处理逻辑

--  public class CommentFilter implements Filter{

    //创建实例后,调用init方法,该方法只执行一次

    public void init(FilterConfig  filterConfig) throws ServletException{ //.....}

    //容器调用doFilter方法处理请求

    public void doFilter(ServletRequest  request,ServletResponse  response,FilterChain  chain)  throws IOException,ServletException{ //......     chian.doFilter(request,response);}

    //容器删除过滤器实例之前调用该方法,该方法只执行一次

    public void destroy(){...  ...}

}

3.将过滤器添加到Web程序中;

--  修改web.xml文件,增加过滤器节点

<filter>

  <filter-name>filter1</filter-name>

  <filter-class>web.xxxServlet</filter-class>

</filter>

<filter-mapping>

  <filter-name>filter1</filter-name>

  <url-pattern>/xxx</url-pattern>

<filter-mapping>

4.把过滤器和Web应用一起打包部署。

--  与web应用程序一起部署过滤器时,只需要把过滤器类和其他web组件类包括在一起,把web.xml文件(连同过滤器注册)放进web应用程序结构中,Servlet容器将处理之后的其他所有事情。

 

过滤器的优先级

如果有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用各个过滤器。

<filter>.......</filter>

<filter>.......</filter>

<filter-mapping>......</filter-mapping>

<filter-mapping>......</filter-mapping>

 

过滤器的初始化参数

容器启动之后,会创建过滤器实例

接下来,容器会调用过滤器的init方法,而容器会事先创建FilterConfig对象。该对象可以访问在web.xml文件中配置的一些参数。

这些在web.xml文件中存储,由FilterConfig对象读取,在执行init方法时能够访问的参数值,叫初始化参数。

通过这些初始化参数可以方便快捷的配置及修改一些辅助参数。

其中初始化参数的配置示例为:

<filter>

  <filter-name>filter1</filter-name>

  <filter-class>web.xxxFilter</filter-class>

  <! -- 初始化参数 -- >

  <init-param>

    <param-name>illegaIStr</param-name>

    <param-value>xxx</param-value>

  </init-param>

</filter>

 

读取初始化参数

使用FilterConfig对象可以读取在web.xml中配置的初始化参数。示例:

String  config.getInitParamter("illegalStr")

 

过滤器的优点:

实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的正常执行;

可以将多个相同处理逻辑的模块集中写在过滤器里面,方便代码的维护。

 

 

监听器

什么是监听器?

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。

容器产生的两大类事件:

--生命周期相关的事件

容器创建或者销毁request,session,ServletContext时产生的事件

--绑定数据相关的事件

调用了request,session,ServletContext的setAttribute,removeAttribute方法时产生的事件

 

如何编写监听器?

1.编写一个java类,依据监听的事件类型选择实现相应的监听器接口。例如要监听Session对象的创建和销毁,要实现HttpSessionListener

--public class CouListener implements HttpSessionListener{ // 实现方法}

2.在监听器接口方法中,实现相应的监听处理逻辑

--public class CouListener implements HttpSessionListener{

  public void sessionCreate(HttpSessionEvent arg0){

    //......

    HttpSession session = arg0.getSession();

    ServletContext ctx = session.getServletContext();(获取session或上下文对象的方法)

  }

}

3.在web.xml文件中注册该监听器

--在web.xml文件中,增加以下节点:

<! -- 监听器 -->

<listener>

  <listener-class>web.CouListener</listener-class>

</listener>

<!-- 实现相同的listener接口的多个监听器,在执行时是按web.xml注册出现的顺序决定 -->

 

应用场景

由于ServletRequest,HttpSession,ServletContext对象都是容器创建的,通过对这些对象注册监听器,就可以得知何时创建了。例如:

在contextDestroy方法中对应用级别的资源进行释放;

统计在线人数可以通过HttpSessionListener监听器的sessionCreated方法监听session的创建动作。

 

未完,暂时总结这些。

转载于:https://www.cnblogs.com/ka-bu-qi-nuo/p/7429247.html

相关文章:

  • 数位DP入门
  • js匿名函数
  • Could not resolve resource location pattern错误解决方案
  • PAT乙级-1026. 程序运行时间(15)
  • HTTP中GET与POST的区别 99%的错误认识
  • 好汉两个半第十二季/全集Two and a Half Men迅雷下载
  • Learning How to Learn
  • 一起玩树莓派3+使用Gitlab搭建专业Git服务
  • Android Finalizing a Cursor that has not been deactivated or closed
  • 土耳其重大数据泄露事件 数据库安全受关注
  • 互联网分析师:5G距离我们还有多远?
  • oracle增加sequence
  • 藏在高端智能手机芯片里的“外交官”:射频前端
  • 哈尔滨工业大学校园网运营:开放兼容,灵活认证
  • js 获取中文的拼音
  • 【Amaple教程】5. 插件
  • 77. Combinations
  • DataBase in Android
  • httpie使用详解
  • JAVA_NIO系列——Channel和Buffer详解
  • Javascripit类型转换比较那点事儿,双等号(==)
  • web标准化(下)
  • 码农张的Bug人生 - 见面之礼
  • 前嗅ForeSpider采集配置界面介绍
  • 前嗅ForeSpider中数据浏览界面介绍
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 小程序开发之路(一)
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​人工智能书单(数学基础篇)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (16)Reactor的测试——响应式Spring的道法术器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二)hibernate配置管理
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (十六)Flask之蓝图
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ./configure、make、make install 命令
  • .apk 成为历史!
  • .chm格式文件如何阅读
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 中 GetProcess 相关方法的性能
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET单元测试
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @JsonFormat与@DateTimeFormat注解的使用
  • @RestController注解的使用
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [android] 切换界面的通用处理