过滤器Filter

文章目录

  • 1. Listener监听器
    • 监听器Listener文档说明
    • 1.1 ServletContextListener监听器
    • 1.2 ServletContextAttributeListener监听器
    • 1.3 HttpSessionListener监听器
    • 1.4 HttpSessionAttributeListener监听器
    • 1.5 ServletRequestListener监听器
    • 1.6 其它监听器
      • 1.6.1 ServletRequestAttributeListener
      • 1.6.2 HttpSessionBindingListener
      • 1.6.3 HttpSessionActivationListener
  • 2. Filter过滤器
    • 2.1 过滤器说明
    • 2.2 过滤器基本原理
    • 2.3 过滤器分析和实例
    • 2.4 url-pattern
    • 2.5 Filter生命周期
    • 2.6 FilterConfig
    • 2.7 FilterConfig应用实例
    • 2.8 过滤器链基本原理分析
      • 2.8.1 过滤链实例演示
      • 2.8.2 过滤链注意事项
    • 2.9 过滤器作业布置

1. Listener监听器

  1. Listener监听器是JavaWeb三大组件之一, JavaWeb三大组件分别是: Servlet程序, Listener监听器, Filter过滤器
  2. Listener是JavaEE的规范, 就是接口
  3. 监听器的作用是, 监听某种变化(一般就是 对象创建/销毁, 属性变化), 触发对应方法完成相应的任务
  4. JavaWeb中的监听器共八个, 目前最常用的是ServletContextListener

监听器Listener文档说明

  1. ServletContextListener(Interface), 用来感知ServletContext对象的创建和销毁
    过滤器Filter_第1张图片
  2. ServletContextAttributeListener(Interface), 用来感知ServletContext对象属性的变化
    过滤器Filter_第2张图片
  3. ServletRequestListener(Interface), 用来监听和感知ServletRequest对象的创建和销毁过滤器Filter_第3张图片
  4. ServletRequestAttributeListener(Interface), 用来感知ServletRequest对象属性的变化
    过滤器Filter_第4张图片
  5. HttpSessionListener(Interface), 用来监听HttpSession对象的创建和销毁
    过滤器Filter_第5张图片
  6. HttpSessionAttributeListener(Interface), 用来监听HttpSession对象属性的变化
    过滤器Filter_第6张图片
  7. HttpSessionBindingListener(Interface)(感知监听器), 将一个数据绑定到Session, 用来一对一的监听
    过滤器Filter_第7张图片
  8. HttpSessionActivationListener(Interface), 用来监听Session绑定的对象钝化或者激活的时间
    钝化: 把Session绑定的对象持久化到磁盘
    激活: 重新读回来再放到Session空间
    过滤器Filter_第8张图片

1.1 ServletContextListener监听器

  1. 作用: 监听ServletContext创建或销毁(当我们Web应用启动时, 就会创建ServletContext), 即生命周期监听. 应用场景: (1) 加载初始化的配置文件; (2) 任务调度(配合定时器Timer/TimerTask)
  2. 相关方法

void contextInitialized(ServletContextEvent sce) 创建ServletContext时触发
contextDestroyed(ServletContextEvent sce) 销毁ServletContext时触发

  1. 应用实例
  1. 新建java项目
    过滤器Filter_第9张图片
    过滤器Filter_第10张图片
  2. 导入Web框架
    过滤器Filter_第11张图片
    过滤器Filter_第12张图片
  3. 引入Servlet-pai.jar包
    过滤器Filter_第13张图片
    过滤器Filter_第14张图片
  4. 配置Tomcat
    过滤器Filter_第15张图片
    过滤器Filter_第16张图片
    过滤器Filter_第17张图片
  5. 新建一个java类
    过滤器Filter_第18张图片
  6. 实现监听器接口
    过滤器Filter_第19张图片
    过滤器Filter_第20张图片
  7. 业务处理
    过滤器Filter_第21张图片
  8. 配置web.xml
    过滤器Filter_第22张图片
  9. 运行结果
    过滤器Filter_第23张图片

1.2 ServletContextAttributeListener监听器

  1. 作用: 监听ServletContext的属性变化
  2. 相关方法

void attributeAdded(ServletContextAttributeEvent event)添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event)替换属性时调用
void attributeRemoved( ServletContextAttributeEvent event)移除属性时调用

  1. 应用实例
  1. 新建java类, 实现监听器接口
    过滤器Filter_第24张图片
  2. 处理业务
    过滤器Filter_第25张图片
    创建并配置HiServlet, 书写业务逻辑中…
    过滤器Filter_第26张图片
  3. 配置web.xml
    过滤器Filter_第27张图片
  4. 运行结果
    项目启动时, ServletContext会添加三个默认对象, 被ZzwServletContextAttributeListener 监听到
    在这里插入图片描述
    访问hiServlet
    过滤器Filter_第28张图片

1.3 HttpSessionListener监听器

  1. 作用: 监听Session创建或销毁, 即生命周期监听(可用于监护用户上线, 离线)
  2. 相关方法

void sessionCreated(HttpSessionEvent se) 创建session时调用
sessionDestroyed(HttpSessionEvent se)销毁session时调用

  1. 应用实例
  1. 新建java类, 实现监听器接口
    功能: 监听session的创建和销毁. 监听到有session创建时, 给该session的生命周期设置为30s
    过滤器Filter_第29张图片
    改进后(用于监护用户上线, 离线)
    过滤器Filter_第30张图片
  2. 配置web.xml
    过滤器Filter_第31张图片
  3. 运行结果
    分析: 项目启动后, 会默认进入首页面, 这时会创建两个和系统相关的session, 30s过后, 这两个session被销毁, 被监听器监听到. 或者(如果不想看到它, 清一下控制台点击重新发布, 就没有了)
    过滤器Filter_第32张图片

1.4 HttpSessionAttributeListener监听器

  1. 作用: 监听Session属性的变化
  2. 相关方法

void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用

  1. 应用实例
  1. 创建并实现监听器
    过滤器Filter_第33张图片
  2. 配置web.xml
    过滤器Filter_第34张图片
  3. 配置Servlet
    过滤器Filter_第35张图片
  4. 运行结果
    过滤器Filter_第36张图片
    过滤器Filter_第37张图片

1.5 ServletRequestListener监听器

  1. 作用: 监听Request创建或销毁, 即Request生命周期监听
  2. 相关方法

void requestInitialized(ServletRequestEvent sre) 创建request时触发
void requestDestroyed(ServletRequestEvent sre) 销毁request时触发

  1. 可以用来监控某个IP访问我们网站的频率, 记录日志, 访问资源的情况
  1. 实现监听器
    过滤器Filter_第38张图片
  2. 配置web.xml
    过滤器Filter_第39张图片
  3. 运行结果
    过滤器Filter_第40张图片

1.6 其它监听器

1.6.1 ServletRequestAttributeListener

1.6.2 HttpSessionBindingListener

1.6.3 HttpSessionActivationListener

2. Filter过滤器

过滤器Filter_第41张图片

2.1 过滤器说明

过滤器Filter_第42张图片

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

2.2 过滤器基本原理

过滤器Filter_第43张图片

  1. 先画图, 清晰思路 => 2. 走代码
    过滤器Filter_第44张图片

2.3 过滤器分析和实例

  1. 先完成一个正确的流程, 看到一个效果 -> 写后面代码就可以验证
  2. 加入其它的功能[1.加入session, 验证合法性]
  1. 创建java项目
    过滤器Filter_第45张图片
  2. 添加Framework框架
    过滤器Filter_第46张图片过滤器Filter_第47张图片
  3. 添加jar包
    过滤器Filter_第48张图片
  4. 配置Tomcat
    过滤器Filter_第49张图片
    过滤器Filter_第50张图片
    过滤器Filter_第51张图片
  5. 先完成一个正确的流程, 同时添加session, 验证合法性
    过滤器Filter_第52张图片
    过滤器Filter_第53张图片
    过滤器Filter_第54张图片
    过滤器Filter_第55张图片
  6. 配置Filter过滤器
    过滤器Filter_第56张图片
    过滤器Filter_第57张图片
  7. doFilter()方法
    过滤器Filter_第58张图片
    tips: 请求转发的内容并不经过过滤器
    如果从login.jsp登录经过LoginCheckServlet请求转发到/manage/admin.jsp页面, 只会调用一次doFilter)(方法, 因为请求转发并不会经过过滤器(即使路径匹配), 但是admin.jsp页面内的图片资源会让浏览器发送获取图片资源的请求, 这是会经过过滤器
    tips: 如何判断doFilter()中的servletRequest和admin.jsp中的request内置对象是同一个对象
    实验设计: 在login页面登录成功后, 直接在地址栏访问admin.jsp页面, 这样即会走过滤器, 又会访问admin.jsp
    过滤器Filter_第59张图片
    过滤器Filter_第60张图片
    实验结果:
    在这里插入图片描述
    tips:
    过滤器Filter_第61张图片
    过滤器Filter_第62张图片

2.4 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的请求均会被拦截

tips: 不能这么配, 这么配即使用户登陆成功也会被拦截
过滤器Filter_第63张图片

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

2.5 Filter生命周期

过滤器Filter_第67张图片
过滤器Filter_第68张图片
不同的浏览器调用这个filter, 次数会叠加
过滤器Filter_第69张图片

2.6 FilterConfig

过滤器Filter_第70张图片

  • FilterConfig说明
  1. FilterConfig是Filter过滤器的配置类
  2. Tomcat每次创建Filter的时候, 也会创建一个FilterConfig对象, 这里包含了Filter配置文件的配置信息
  3. FilterConfig对象作用是获取filter过滤器的配置内容
  1. 新建ZzwFilterConfig类
    过滤器Filter_第71张图片
    过滤器Filter_第72张图片
  2. 配置web.xml
    过滤器Filter_第73张图片

2.7 FilterConfig应用实例

  1. 拦截网段0:0:0:0:0:0:0:1
    过滤器Filter_第74张图片
    过滤器Filter_第75张图片
    过滤器Filter_第76张图片
    0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机。
    过滤器Filter_第77张图片

2.8 过滤器链基本原理分析

在处理某些复杂业务的时候, 一个过滤器往往不够, 可以设计多个过滤器共同完成任务, 形成过滤器链
过滤器Filter_第78张图片

2.8.1 过滤链实例演示


  1. 过滤器Filter_第79张图片
  2. AFilter.class, BFilter.class
  3. 配置过滤器
    过滤器Filter_第80张图片
  4. 运行结果
    过滤器Filter_第81张图片
    过滤器Filter_第82张图片

2.8.2 过滤链注意事项

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

实验设计
过滤器Filter_第83张图片
过滤器Filter_第84张图片
请求两次
过滤器Filter_第85张图片
实验结果
过滤器Filter_第86张图片

  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过滤器后置代码->返回给浏览器数据

2.9 过滤器作业布置

过滤器Filter_第87张图片

  1. topic.jsp
    过滤器Filter_第88张图片
  2. showTopic.jsp
    过滤器Filter_第89张图片
  3. TopicFilter.jsp
    过滤器Filter_第90张图片
    web.xml配置
    过滤器Filter_第91张图片
  4. 运行结果
    过滤器Filter_第92张图片
    过滤器Filter_第93张图片
  5. 目录结构
    过滤器Filter_第94张图片

你可能感兴趣的:(JavaWeb,servlet,java,前端)