初学Java Web(8)——过滤器和监听器

什么是过滤器

过滤器就是 Servlet 的高级特性之一,就是一个具有拦截/过滤功能的一个东西,在生活中过滤器可以是香烟滤嘴,滤纸,净水器,空气净化器等,在 Web 中仅仅是一个实现了 Filter 接口的 Java 类而已。

  • 特点:双向,拦截请求,拦截响应
  • 作用: 过滤器可以对所有的请求或者响应做拦截操作

为什么在 Web 开发中需要用到过滤器?

  • 问题:为什么非得使用过滤器,我直接在 Servlet 中作判断不行吗?
  • 开发遵循的原则: 1.DRY原则(Don't Reeat Yourself,不要重复你自己):重复,意味着维护的成本很高。 2.责任分离原则:谁擅长什么功能就做什么功能,Servlet 擅长的是逻辑而不是处理请求

举一个实际的例子:(处理 POST 请求中文编码的问题)

  • Web 中过滤器的作用: 1.可以在请求资源之前设置请求的编码 2.可以进行登录校验 3.可以进行请求参数的内容的过滤 4.数据压缩 / 数据加密 / 数据格式的转换 5.可以设置浏览器相关的数据

Filter 的开发和使用

对应于 Servlet 的开发步骤:

  1. 定义一个类,实现 Filter 接口
  2. doFilter() 方法中对请求响应进行过滤
  3. 在 web.xml 文件中进行 Filter 的配置(告诉服务器来管理当前的 Filter)
<!-- web.xml -->
<filter>
    <filter-name>filter的名称</filter-name>
    <filter-class>filter类的全限定名</filter-class>
</filter>
<filter-mapping>
    <filter-name>指定对哪一个filter做的映射</filter-name>
    <url-pattern>指定对哪些资源进行过滤</url-pattern>
</filter-mapping>
  • 注意:此时 <url-pattern> 表示对哪些资源做过滤/拦截。例如:
  • /hello.jsp 当前 Filter 就仅仅只对 hello.jsp 资源做拦截.
  • /index 当前 Filter 就仅仅只对 /index 资源做拦截.
  • /* 当前 Filter 就对所有资源做拦截.访问任意的资源,都会先进入该过滤器器.
  • /system/* 当前 Filter 就对以 /system/ 打头的资源做拦截. 如/system , /system/a, /system/a/b/c, /systema

Filter 映射细节

  1. 在启动服务器的时候,就创建了 Filter 对象并执行了初始化方法 init()。Filter 先于 Servlet 存在于服务端
  2. 在应用中允许存在多个 Filter ,到底哪一个 Filter 先执行哪一个后执行,这取决于在 web.xml 中定义的先后次序 (如果使用注解配置,则 Filter 的执行顺序由 Filter 的类名的字母的顺序来决定,如 AFilter 和 BFilter,则先执行 AFilter)
  3. 一个 Filter 可以配置多个 <url-pattern> 也可以对指定的 Servlet 做过滤(注解通过 servletNames 指定,配置由 <servlet-name> 指定)
  4. 默认情况下,Filter 只对新的请求做拦截,如果是请求转发,则不会过滤。
  • <dispatcher>配置项指定了 Filter 的过滤时间:
  • REQUEST只对请求做过滤,默认选项,如果有该配置项则必须显式写明
  • FORWARD:只对请求转发(forword)方式做过滤
  • ERROR:只对跳转到全局的错误页面做过滤
  • INCLUDE:只对请求包含(include)方式做过滤
  • 对应的注解属性为:dispatcherTypes

过滤器实例

戳这里


监听器

  • 作用: 1.监听 web 应用的创建和销毁 2.attribute发生的变化。
  • web 应用:即ServletContext对象(jsp的隐式对象application)

除了对web应用的监听外,还能监听sessionrequest的生命周期,以及他们的attribute发生的变化。

了解详情戳这里

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木头编程 - moTzxx

ThinkPHP5.1 配置Nginx/Apache下的 URL重写

4212
来自专栏calvin

jira webhook 事件触发并程序代码调用jenkins接口触发构建操作

开发管理工具触发站点构建事件,事件处理中需要调用Jenkins接口开始构建动作。 我的应用场景: 使用jira作为管理工具,在jira中创建自定义的工作流来...

7083
来自专栏Petrichor的专栏

Cudnn安装与可能遇到的问题

983
来自专栏游戏杂谈

cocos2d-x 在输入文字时点击语音crash

修改CCDirectorCaller.mm文件 (cocos2dx/platform/ios/CCDirectorCaller.mm)

952
来自专栏沈唁志

新版phpStudy访问localhost不显示目录列表报错500的解决方法

之前开发都用的16版的phpStudy,也没出现过什么大问题,入职以后直接在官网下的最新版,就出了一些小问题 访问本地localhost和127.0.01,会...

1.2K1
来自专栏pythonlove

Linux防火墙iptables(二)

上一篇文章我们说了一些iptables/netfilter的基础知识,本文我们来介绍一下iptables的规则编写。Iptables的规则可以概括的分为两个方面...

3302
来自专栏草根专栏

用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

http://www.cnblogs.com/cgzl/p/9010978.html

1432
来自专栏Java架构沉思录

Linux常用Shell脚本知多少

在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运...

1261
来自专栏lonelydawn的前端猿区

详解karma & jasmine自动化测试

前端包管理工具 代码重用和复用是快捷开发的一种重要方式,但是原始的代码模块散布于各个平台上,不好寻找,程序员对其进行有效管理也成为了一大难题。此时,依赖(包、插...

2498
来自专栏Google Dart

Dart VM教程 顶

本教程让您准备好开始在编辑器或IDE中编写Dart应用程序。 在这里,您将下载Dart软件并创建并运行一个小应用程序。

2111

扫码关注云+社区

领取腾讯云代金券