Filter过滤器
1、过滤器概述
过滤器(Filter
)就是在源数据和目的数据之间起过滤作用的中间组件。其主要作用是:过滤请求和响应。
我们可以将一些多个(或所有)Servlet
中都需要解决的问题放在过滤器中处理。如:
-
户请求进行统一认证
-
对用户的访问请求进行记录和审核(登录验证)
-
对用户发送的数据进行过滤或者替换
-
对响应内容进行压缩,减少传输容量
-
对请求和响应进行加解密处理
2、工作原理
过滤器的工作原理如下图所示:
-
当
web
容器接收到对一个资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将会把这个请求先交给过滤器进行处理。此时我们便可以在过滤器中对请求进行处理(如:改变请求的内容或者重新设置请求的报头信息等)。待过滤完成后,web
容器再将请求发送给目标资源。 -
当目标资源对请求作出响应时,容器同样会将响应先转发给过滤器。在过滤器中,我们可以对响应的内容进行转换。待过滤完成后,
web
容器再将响应发送给客户端。
注:
-
生命周期:过滤器在服务器启动时创建,在服务器关闭时被销毁。
-
在
web
应用中,我们可以部署多个过滤器,这些过滤器组成过滤器链(FilterChain
)。 -
过滤器链中的每一个过滤器负责特定的操作和任务。
-
web
服务器会根据web.xml
文件中过滤器的注册顺序依次调用。当第一个过滤器的doFilter
方法被调用时,web
服务器会创建一个过滤器链的FilterChain
对象传递给该方法。 -
在请求资源时,过滤器链中的过滤器将依次对请求进行处理,将请求传递给下一个过滤器,直到目标资源;在发送响应时,则按照相反的顺序依次对响应进行处理,直到客户端。
3、使用步骤
使用过滤器与创建Servlet
类似,主要分为以下两个步骤:
(1)编写一个Java类实现Filter接口。
(2)在web.xml
文件中配置(注册)Filter。
注:与Servlet
不同的是,Filter
并没有类似于HttpServlet
的实现类可供继承,要使用过滤器,我们只能实现javax.servlet
包中的Filter
接口。
4、应用示例:使用过滤器解决请求和响应中文乱码问题
4.1、创建测试项目
(1)使用Maven
模板创建一个MavenWeb
项目(具体步骤参考《Maven详解》),项目名称为javaweb-filter
。
(2)同样地,填写项目名称和Maven
项目GAV
。
(3)同样地,配置该MavenWeb
项目的安装目录、配置文件和本地仓库。点击Finish
按钮完成项目创建,等待Maven
依赖包导入完毕。
(4)同样地,为了避免以后出现兼容性问题,建议我们先将该项目中的web.xml
文件替换成“web-app_4_0”
版本(具体步骤参考《Servlet
详解》)。
(5)同样地,在该项目的main
文件夹下新建一个java
文件夹和一个resource
文件夹,并将它们分别标记为“源码根目录”和“资源根目录”。
(6)同样地,配置Tomcat服务器,deploy(发布)javaweb-filter:war exploded
包,并为该项目添加虚拟路径映射:/filter
(具体步骤参考《Tomcat
详解》)。
(7)在项目的pom.xml
文件中添加项目依赖,并重新加载Maven项目。
pom.xml
文件:
1 | <dependencies> |
(8)同样地,在该项目的java
目录下新建一个com.atangbiji.servlet
包,并在该包下新建一个ShowServlet
类,用于在页面上输出中文字符。同样地,让ShowServlet
类继承(extends)HttpServlet
类,以实现Servlet
接口。然后,在ShowServlet
类中重写doGet
和doPost
方法。
ShowServlet.java
文件:
1 | public class ShowServlet extends HttpServlet { |
(9)同样地,在该项目的Web
配置文件(web.xml
)中注册(映射)我们自己编写的Servlet
,并为它提供一个浏览器可以访问的路径。
web.xml
文件:
1 | <servlet> |
注:一个Servlet
程序可以指定一个或者多个映射路径。
(10)在IDEA中启动Tomcat。在浏览器中输入http://localhost:8080/filter/show/test
和http://localhost:8080/filter/test
,访问结果均出现中文乱码现象。如下图所示:
4.2、创建过滤器,实现Filter接口
(11)在该项目的java
目录下新建一个com.atangbiji.filter
包,并在该包下新建一个CharacterEncodingFilter
类,用于处理请求和响应中文乱码问题。类似地,让CharacterEncodingFilter
类实现(implements)javax.servlet
包中的Filter
接口。然后,在CharacterEncodingFilter
类中重写init
、doFilter
和destroy
方法。
**注:**此处,我们创建的过滤器实现的是javax.servlet
包中的Filter
接口,不是其它包中的Filter
接口。
CharacterEncodingFilter.java
文件:
1 | public class CharacterEncodingFilter implements Filter { |
4.3、配置(注册)过滤器,添加过滤路径
(12)类似地,在该项目的Web
配置文件(web.xml
)中注册(映射)我们自己编写的Filter
,并根据实现需要为它添加过滤路径。
web.xml
文件:
1 | <filter> |
**注:**过滤器过滤路径的规则与Servlet
映射(访问)路径的规则完全相同。
4.4、测试结果
(13)重启Tomcat。若在浏览器中输入http://localhost:8080/filter/show/test
,则页面会被过滤器过滤,访问结果不会出现中文乱码现象。
若在浏览器中输入http://localhost:8080/filter/test
,则页面不会被过滤器过滤,访问结果仍然会出现中文乱码现象。
(本讲完,系列博文持续更新中…… )
关注**“阿汤笔迹”** 微信公众号,获取更多学习笔记。
原文地址:http://www.atangbiji.com/2022/10/18/filter
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。