JavaWeb系列十五: JavaWeb三大组件之过滤器Filter

在这里插入图片描述

在这里插入图片描述

过滤器说明

在这里插入图片描述

  • 过滤器说明
  1. Filter 过滤器是JavaWeb三大组件之一(Servlet, Listener监听器, Filter过滤器)
  2. Filter 过滤器是JavaEE的规范, 是接口
    在这里插入图片描述
  3. Filter 过滤器它的作用是: 拦截请求, 过滤响应
  4. 应用场景
  • 权限检查
  • 日记操作
  • 事务管理

过滤器基本原理

在这里插入图片描述

  1. 先画图, 清晰思路 => 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

  1. url-pattern: Filter的拦截路径, 即浏览器在请求什么位置的资源时, 过滤器会进行拦截过滤
  2. 精确匹配 /a.jsp对应的 请求地址http://ip[域名]:port/工程路径/a.jsp会拦截
  3. 目录匹配 /manage/*对应的 请求地址http://ip[域名]:port/工程路径/manage/xx, 即web工程manage目录下所有资源 均会拦截
  4. 后缀名匹配 *.jsp(后缀名可变, 比如*.action *.do)对应的 请求地址http://ip[域名]:port/工程路径/xx.jsp, 后缀名为.jsp的请求均会被拦截
  5. Filter配置一般在web.xml的最上面; 一个Filter可以配置多个url-pattern
  6. 对于要拦截的目录中的某些要放行的资源, 再通过配置指定
    在这里插入图片描述
<?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>
       <!--这里配置要验证的url
           1.在filter-mapping中的url-pattern配置 要拦截/验证的url
           2.对于我们不去拦截的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: 不能这么配, 这么配即使用户登陆成功也会被拦截
在这里插入图片描述

  1. Filter过滤器它只关心请求的地址是否匹配, 不关心请求的资源是否存在
  1. 在未登陆的情况下, 请求http://localhost:8085/filter/manage/xxx, 会被拦截器拦截到进入登录页面
    在这里插入图片描述
    在这里插入图片描述
  2. 登录成功后再次访问http://localhost:8085/filter/manage/xxx, 拦截器放行, 请求不到该资源, 将返回404
    在这里插入图片描述
    在这里插入图片描述

Filter生命周期

在这里插入图片描述
在这里插入图片描述
不同的浏览器调用这个filter, 次数会叠加
在这里插入图片描述

FilterConfig

在这里插入图片描述

  • FilterConfig说明
  1. FilterConfig是Filter过滤器的配置类
  2. Tomcat每次创建Filter的时候, 也会创建一个FilterConfig对象, 这里包含了Filter配置文件的配置信息
  3. FilterConfig对象作用是获取filter过滤器的配置内容
  1. 新建ZzwFilterConfig类
    在这里插入图片描述
    在这里插入图片描述
  2. 配置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,也就是本机。
在这里插入图片描述

过滤器链基本原理分析

在处理某些复杂业务的时候, 一个过滤器往往不够, 可以设计多个过滤器共同完成任务, 形成过滤器链
在这里插入图片描述

过滤链实例演示


  1. 在这里插入图片描述
  2. AFilter.class, BFilter.class
    在这里插入图片描述
  3. 配置过滤器
    在这里插入图片描述
  4. 运行结果
    在这里插入图片描述
    在这里插入图片描述

过滤链注意事项

  1. 多个filter和目标资源在一次http请求中, 同时在一个线程中

实验设计
在这里插入图片描述
在这里插入图片描述
请求两次
在这里插入图片描述
实验结果
在这里插入图片描述

  1. 当一个请求的url和filter的url-pattern匹配时, 才会被执行, 如果有多个匹配上, 就会顺序执行, 形成一个filter调用链(底层可以使用一个数据结构搞定)
  2. 多个filter共同执行时, 因为是一次http请求, 所以使用同一个request对象
  3. 多个filter执行顺序, 和web.xml配置顺序保持一致
  4. chain.doFilter(servletReuqest, servletResponse), 即执行下一个过滤器的doFilter方法, 如果后面没有过滤器, 则执行目标资源
  5. 小结: 注意执行过滤器链时, 顺序是: Http请求->A过滤器doFilter()方法->A过滤器前置代码->A过滤器chain.doFilter()->B过滤器doFilter()方法->B过滤器前置代码->B过滤器chain.doFilter()->目标资源->B过滤器后置代码->A过滤器后置代码->返回给浏览器数据

过滤器作业布置

在这里插入图片描述

  1. topic.jsp
    在这里插入图片描述
  2. showTopic.jsp
    在这里插入图片描述
  3. TopicFilter.jsp
    在这里插入图片描述
    web.xml配置
    在这里插入图片描述
  4. 运行结果
    在这里插入图片描述
    在这里插入图片描述
  5. 目录结构
    在这里插入图片描述
  • 37
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~ 小团子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值