当前课程知识点:Web后端开发技术 > 第7章 Filter和Listener > 7.1 过滤器 > 7.1.1过滤器(1)
同学们好
欢迎回来继续学习web后端开发技术
在这一小节当中
我们将学习过滤器核心接口与配置
通过之前的课程
我们知道当浏览器发送一个请求
到达web容器的时候
由web容器创建请求对象和响应对象
然后递交给相应的web组件
实现相应的业务逻辑
最后将结果直接返回给客户端
那么
当我们在项目当中加入了过滤器以后
它的工作过程是什么样的呢
当我们在项目当中加入过滤器以后
一个请求到达Web容器
那么Web容器将会根据过滤的条件
来检查当前请求
是否要经过过滤器
如果不需要经过那么容器
将请求直接递交给目标资源
如果这个请求符合过滤的条件
那么它就要先经过过滤器
进行一个前处理
前处理
你比如检查一下用户请求的资源
是否具有相应的访问权限
还可以对请求的内容做修改
经过前处理以后
再把请求递交给web组件进行相应的
业务处理
那么处理完以后
那么这个结果并不是直接返回给
客户端
而是还要经过过滤器进行后处理
后处理
你比如对想的内容做算法上的压缩
处理
最后由web容器将结果返回给客户端
那么这就是过滤器它的执行过程
当在开发当中
我们使用的过滤器可能不止一个
那么
有多个构成的过滤器
我们把它叫做过滤器链
在这里我们设立了两个过滤器
它们构成了一个过滤器链
对于每一个过滤器
它的代码可以分为这么三部分
一部分代码叫作前处理
第二部分
我们这里写的是chain.doFilter
它的作用是要调用下一个过滤器
第3部分代码叫做后处理
那么下面我们看一下一个请求
经过过滤器链的执行过程
当请求经过过滤器的时候
首先要经过前处理
前处理完成以后
由chain.doFilter调用下一个
过滤器
到达下一个过滤器
还要进行前处理
前处理完成以后
由chain.doFilter
调用下一个过滤器
如果当前的过滤器是最后一个过滤器
那么它就会将请求递交给目标资源
那么目标资源处理完业务以后
它的返回首先要将结果返回给最后
一个过滤器
进行后处理
然后再把请求依次向前传递
到达前一个过滤器的后处理
最后将结果返回给客户端
那么这就是过滤器链的执行过程
过滤器的实现主要依赖这样三个接口
第1个
javax.servlet.Filter接口
第2个
javax.servlet.FilterConfig接口
第3个接口叫做
javax.servlet.Chain接口
下面我们逐一对这三个接口进行一个
简单的介绍
首先我们看一下Filter接口
那么Filter接口包含了三个
方法
第1个方法叫init方法
在这个方法当中
我们看到有一个filterConfig
对象
它的作用是实现容器的初始化
那么这个方法是由容器来调用的
类似于servlet当中的init方法
第2个方法叫做doFilter
它里面有三个参数
第1个参数是ServletRequest
第2个参数是ServletResponse
第3个参数叫做FilterChain
它的作用是当请求经过时
由容器调用这个方法
对请求和响应进行相应的处理
这里面FilterChain对象的
doFilter方法
将负责请求传递给下一个过滤器
如果他是最后一个过滤器
那么将请求递交给目标资源
第3个方法叫做destroy
它的作用是当
过滤器生命周期结束前
由容器调用这个方法
释放相应的资源
通过这个表格我们知道
过滤器接口这三个方法
它是对过滤器生命周期的
管理的三个方法
接下来我们介绍一下过滤区的生命周期
首先是创建
那么这个创建是由容器来创建过滤器
对象
接下来是初始化由容器
调用init方法来实现过滤器的
初始化
第3个
doFilter
那么在doFilter方法当中
要实现对请求的过滤
那么同学们会想到
如果是一个过滤器链
那么过滤器链上面的过滤器
它的执行顺序是如何而定的
类似于
servlet
过滤器它也有两种配置方式
一种方式是通过注解方式进行配置
另外一种是通过web.xml
进行配置
在这两种方式下
过滤器链当中的过滤器的执行顺序是
不一样的
下面我们说一下它的执行顺序
对于注解配置
我们使用的是@WebFliter
它里面有个属性叫做filterName
那么这个属性会对应于
一个过滤器的类
在这种情况下
会按照字符的顺序执行过滤器
对应于web.xml
这种配置
当中有一个filter-mapping的顺序
过滤器是按照这个顺序来执行
过滤器
那么在过滤器执行过程当中
我们在编写代码的时候
有三种处理方式
第1种处理方式是向客户端返回响应信息
第2种处理方式是将请求发给下一个
过滤器或者是目标资源
第3种处理方式
将请求进行转发或者是重定向到其他
资源上面去
最后一个生命周期就是销毁
由容器调用destroy方法
释放相应的资源
接下来我们介绍一下FilterConfig接口
那么这个接口由容器实现
它主要作用是获取过滤器
初始化参数和应用的上下文
我们看一下接口相关的方法
第1个方法是getFilterName
用于获取过滤器的名字
第2个叫做getInitParameter
获取过滤器的初始化参数
第3个方法叫做getInitParameterNames
获取过滤器的
所有的初始化参数名
下面这个方法是用于获取
servlet
上下文对象
第3个接口
FilterChain接口
它的作用是将其实例作为参数传递给
过滤器的
doFilter方法
过滤器使用这个对象
调用下一个过滤器
那么这个接口也是由容器来实现的
我们看一下它里面的方法
这个方法只有一个
它里面有两个参数
一个是ServletRequest
另外一个是ServletResponse
它的作用就是调用下一个过滤器
如果当前的过滤器是最后一个
那么它将调用目标资源
接下来我们介绍一下过滤器的配置
刚才我们已经提到了
过滤器有两种配置的方式
那么这个前提条件
这里面进一步明确一下
它使用的是Servlet3.0以上这种
版本
在这种版本之上可以使用
注解配置
还可以通过web.xml进行
配置
下面我们就把关于注解配置当中的
属性给大家做一个简单的介绍
第1个属性名叫做FilterName
这个很容易理解
就是过滤器的名字
这是一个不是必选项
接下来是urlPatterns或者是value
这是一个必选项
它是指定一组过滤器的url匹配模式
换句话说
它需要指定对哪些请求的资源进行
过滤或者叫拦截
它可以使用两种匹配的模式
一种是路径匹配
一种是扩展名匹配
接下来是servletNames
也就是说在过滤器当中通过属性来
指定
对哪些servlet来进行过滤
那么这里面需要提供servlet
当中的Names的属性值
servlet可以有多个
下面这个参数是关于请求模式的
因为请求模式有request
forward include error
还有async
那么在过滤器当中通过参数名来指定
对哪种类型的请求进行过滤
默认的是对request类型的请求进行过滤
接下来属性名叫做initParams
它的作用是指定一组过滤器的初始化
参数
接下来参数名的作用是指定过滤器
是否支持异步的模式
接下来是description描述
过滤器
displayName
过滤器的显示名
我们需要注意的是
这里面最关键的就是关于url匹配
模式
刚才我们已经提到了
有两种
一种是路径匹配
例如这种写法
那么这个写法是对所有的资源的都要
进行过滤
这是一个星号
第2种写法是扩展名的匹配
如*.jsp
也就是说它会对所有请求文件扩展
名为.jsp的文件
进行过滤
这里面说了不可以是两者的混合使用
比如这种形式是不允许的
下面我们看一个使用注解方式配置的
过滤器
逐一给大家做一个简单介绍
上面是过滤器的描述
过滤器的显示的名称
过滤器的名字
TestFiter
接下来指出了对哪种类型的资源进行
过滤
这里面写的是*.jsp
也就是说当我们访问一个JSP文件
的时候
都要经过这个过滤器
还有servletName指定了
对哪个servlet进行过滤
这里提到了对TestServlet
进行过滤
其他的servlet就放行了
接下来这个是初始化参数
初始化参数我们看到它的名字是CharacterEncoding
字符编码
它的值是UTF-8
请求的类型这里面我们看到是request
那么过滤器综合起来可以这样来说
它会对请求类型为request这种请求
资源的扩展名
为.jsp的这种资源以及名字为
TestServlet
这种Servlet进行过滤
或者说进行拦截
接下来我们看一下刚才配置过滤器的
实现代码
在这个实现代码当中我们看到
有两部分
第一部分是过滤前的处理
那么当符合条件的请求到达过滤器以后
首先要经过过滤前的处理
那么这段代码执行以后
它将执行下面这行代码
chain.doFilter
将请求递交给相应的
TestServlet
或者是JSP文件
当目标资源执行完相应的业务逻辑
以后
程序将回到这里继续进行运行
这个是需要大家一定注意的
刚才我们已经提到
过滤器它有两种配置方式
一种是注解配置
第2种就是在web.xml中
进行配置
下面给大家做一个简单的介绍
在web.xml中配置它需要用到两个元素
一个元素叫做filter
第2个元素是filter-mapping
在filter元素当中又包含了多个
子元素
第1个是描述
第2个是显示名称
第3个是过滤器的名字叫TestFilter
接下来这个子元素是filter-class
也就是说你这个过滤器名所对应的
这个类到底是哪个类
这里面要写全限定名
下面指定了过滤区的初始化参数
在filter-mapping元素当中
又包含了多个子元素
第1个子元素是filterName
那么这个name一定要和上面的filterName是
完全一致的
接下来是它的匹配模式
对
所有的JSP进行匹配
再下边这个子元素是指定了
对
哪个servlet进行匹配
在下边元素指明了是对哪种请求的
类型进行匹配
我们看这些元素它的属性名称和在
注解配置当中的属性
名称基本上是一样的
-1.0 导学
--1.0.1 导学
-1.1 Web应用开发概述
--1.1.3 测试
-1.2 准备Java Web应用开发环境
--1.2.2 测试
-1.3 任务实现:Hello World Web项目
--1.3.2 测试
-1.4 小结
--1.4.1 小结
-本课程所有代码
--课程参考代码
-2.0 导学
--2.0.1 导学
-2.1 Servlet概述
--2.1.3 测试
-2.2 创建Servlet
--2,2,3 作业
-2.3 Servlet应用
--2.3.4 测试
-2.4 任务实现:某高校毕业生信息发布系统-注册与登录(Servlet版)
--2.4.3 测试
-2.5 ServletConfig接口
-2.6 ServletContext接口
-2.7 HttpServletRequest接口
--2.7.5 测验
-2.8 HttpServletResponse接口
--2.8.3 测试
-2.9 任务实现:某高校毕业生信息发布系统-简历添加
--2.9.1 任务实现:某高校毕业生信息发布系统-简历添加
-2.10 小结
-动画演示:Java Web应用服务器处理客户端请求的过程
-3.0 导学
--3.0.1 导学
-3.1 Cookie技术
--3.1.3 测试
-3.2 Session技术
--3.2.2 Session技术-Session技术应用购物车
--3.2.3 测试
-3.3 URL重写与隐藏表单域
--3.3.2 测试
-3.4 任务实现:某高校毕业生信息发布系统-简历修改
--3.4.1 任务实现:某高校毕业生信息发布系统-简历修改
-3.5 小结
--3.5.1 小结
-4.0 导学
-4.1 jsp概述
--4.1.2 测试
-4.2 脚本元素
--4.2.2 测试
-4.3 指令元素
--4.3.2 测试
-4.4 动作元素
--4.4.3 测试
-4.5 内置对象
--4.5.3 测试
-4.6 JavaBean
--4.6.3 测试
-4.7 任务实现:某高校毕业生信息发布系统-首页(JSP版)
--4.7.1 任务实现:某高校毕业生信息发布系统-首页(JSP版)
-4.8 小结
--4.8.1 小结
-5.0 导学
--5.0.2 测试
-5.1 el语法
--5.1.2 测试
-5.2 el隐含对象
--5.2.2 测试
-5.3 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.1 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.2 测试
-5.4 小结
--5.4.1 小结
-6.0 导学
--6.0.2 测试
-6.1 核心标签库
--6.1.5 测试
-6.2 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.1 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.2 测试
-6.3 小结
--6.3.1 小结
-7.0 导学
--7.0_导学
-7.1 过滤器
--7.1.3 测试
-7.2 监听器
--7.2.1.1与ServletContext相关的监听器
--7.2.4 测试
-7.3 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.1 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.2 测试
-7.4 小结
--7.4.1小结
-8.0 导学
--8.0_导学
-8.1 JDBC API
--8.1.2 测试
-8.2 JDBC API访问MySQL基本步骤
--8.2.2 测试
-8.3 任务实现:某高校毕业生信息发布系统-注册与登录
--8.3.1 任务实现:某高校毕业生信息发布系统-注册与登录(JDBC版)
--8.3.2 测试
-8.4 小结
--8.4.1小结
-9.0导学
--9.0导学
-9.1 技术准备
--9.1.5 测试.
-9.2 系统设计
-9.3 系统实现
-9.4 小结
--9.4.1小结


