老韩-JavaWeb三大组件之过滤器Filter
- 过滤器说明
- 过滤器基本原理
- 过滤器分析和实例
- url-pattern
- Filter生命周期
- FilterConfig
- FilterConfig应用实例
- 过滤器链基本原理分析
- 过滤链实例演示
- 过滤链注意事项
- 过滤器作业布置
过滤器说明
- 过滤器说明
- Filter 过滤器是JavaWeb三大组件之一(Servlet, Listener监听器, Filter过滤器)
- Filter 过滤器是JavaEE的规范, 是接口
- Filter 过滤器它的作用是: 拦截请求, 过滤响应
- 应用场景
- 权限检查
- 日记操作
- 事务管理
过滤器基本原理
- 先画图, 清晰思路 => 2. 走代码
过滤器分析和实例
1.先完成一个正确的流程, 看到一个效果 -> 写后面代码就可以验证
2.加入其它的功能[1.加入session, 验证合法性]
代码实现
1.创建 javaWeb 项目filter
参考 IDEA 2022.3开发JavaWeb工程
2.添加 filter项目所需jar包
3.先完成一个正确的流程, 同时添加session, 验证合法性
4.配置Filter过滤器
import javax.servlet.Filter;
5.doFilter()方法
tips: 请求转发的内容并不经过过滤器
如果从login.jsp登录经过LoginCheckServlet请求转发到/manage/admin.jsp页面, 只会调用一次doFilter)(方法, 因为请求转发并不会经过过滤器(即使路径匹配), 但是admin.jsp页面内的图片资源会让浏览器发送获取图片资源的请求, 这时会经过过滤器
tips: 如何判断doFilter()中的servletRequest和admin.jsp中的request内置对象是同一个对象
实验设计: 在login页面登录成功后, 直接在地址栏访问admin.jsp页面, 这样即会走过滤器, 又会访问admin.jsp
实验结果:
tips:
url-pattern
- url-pattern: Filter的拦截路径, 即浏览器在请求什么位置的资源时, 过滤器会进行拦截过滤
- 精确匹配 /a.jsp对应的 请求地址http://ip[域名]:port/工程路径/a.jsp会拦截
- 目录匹配 /manage/*对应的 请求地址http://ip[域名]:port/工程路径/manage/xx, 即web工程manage目录下所有资源 均会拦截
- 后缀名匹配 *.jsp(后缀名可变, 比如*.action *.do)对应的 请求地址http://ip[域名]:port/工程路径/xx.jsp, 后缀名为.jsp的请求均会被拦截
- Filter配置一般在web.xml的最上面; 一个Filter可以配置多个url-pattern
- 对于要拦截的目录中的某些要放行的资源, 再通过配置指定
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--过滤器一般我们配置在上面--><filter><filter-name>AuthFilter</filter-name><filter-class>com.zzw.furns.filter.AuthFilter</filter-class><init-param><!--这里配置了后, 还需要在过滤器中处理--><param-name>excludedUrls</param-name><param-value>/views/manage/manage_login.jsp,/views/member/login.jsp</param-value></init-param></filter><filter-mapping><filter-name>AuthFilter</filter-name><!--这里配置要验证的url1.在filter-mapping中的url-pattern配置 要拦截/验证的url2.对于我们不去拦截的url, 就不配置3.对于要拦截的目录中的某些要放行的资源, 再通过配置指定--><url-pattern>/views/cart/*</url-pattern><url-pattern>/views/manage/*</url-pattern><url-pattern>/views/member/*</url-pattern><url-pattern>/views/order/*</url-pattern><url-pattern>/cartServlet</url-pattern><url-pattern>/manage/furnServlet</url-pattern><url-pattern>/orderServlet</url-pattern><url-pattern>/orderItemServlet</url-pattern></filter-mapping>
</web-app>
tips: 不能这么配, 这么配即使用户登陆成功也会被拦截
- Filter过滤器它只关心请求的地址是否匹配, 不关心请求的资源是否存在
- 在未登陆的情况下, 请求http://localhost:8085/filter/manage/xxx, 会被拦截器拦截到进入登录页面
- 登录成功后再次访问http://localhost:8085/filter/manage/xxx, 拦截器放行, 请求不到该资源, 将返回404
Filter生命周期
不同的浏览器调用这个filter, 次数会叠加
FilterConfig
- FilterConfig说明
- FilterConfig是Filter过滤器的配置类
- Tomcat每次创建Filter的时候, 也会创建一个FilterConfig对象, 这里包含了Filter配置文件的配置信息
- FilterConfig对象作用是获取filter过滤器的配置内容
- 新建ZzwFilterConfig类
- 配置web.xml
FilterConfig应用实例
拦截网段0:0:0:0:0:0:0:1
0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机。
过滤器链基本原理分析
在处理某些复杂业务的时候, 一个过滤器往往不够, 可以设计多个过滤器共同完成任务, 形成过滤器链
过滤链实例演示
- 图
- AFilter.class, BFilter.class
- 配置过滤器
- 运行结果
过滤链注意事项
- 多个filter和目标资源在一次http请求中, 同时在一个线程中
实验设计
请求两次
实验结果
- 当一个请求的url和filter的url-pattern匹配时, 才会被执行, 如果有多个匹配上, 就会顺序执行, 形成一个filter调用链(底层可以使用一个数据结构搞定)
- 多个filter共同执行时, 因为是一次http请求, 所以使用同一个request对象
- 多个filter执行顺序, 和web.xml配置顺序保持一致
- chain.doFilter(servletReuqest, servletResponse), 即执行下一个过滤器的doFilter方法, 如果后面没有过滤器, 则执行目标资源
- 小结: 注意执行过滤器链时, 顺序是: Http请求->A过滤器doFilter()方法->A过滤器前置代码->A过滤器chain.doFilter()->B过滤器doFilter()方法->B过滤器前置代码->B过滤器chain.doFilter()->目标资源->B过滤器后置代码->A过滤器后置代码->返回给浏览器数据
过滤器作业布置
- topic.jsp
- showTopic.jsp
- TopicFilter.jsp
web.xml配置
- 运行结果
- 目录结构