文章目录
- 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监听器
- Listener监听器是JavaWeb三大组件之一, JavaWeb三大组件分别是: Servlet程序, Listener监听器, Filter过滤器
- Listener是JavaEE的规范, 就是接口
- 监听器的作用是, 监听某种变化(一般就是 对象创建/销毁, 属性变化), 触发对应方法完成相应的任务
- JavaWeb中的监听器共八个, 目前最常用的是ServletContextListener
监听器Listener文档说明
- ServletContextListener(Interface), 用来感知ServletContext对象的创建和销毁
- ServletContextAttributeListener(Interface), 用来感知ServletContext对象属性的变化
- ServletRequestListener(Interface), 用来监听和感知ServletRequest对象的创建和销毁
- ServletRequestAttributeListener(Interface), 用来感知ServletRequest对象属性的变化
- HttpSessionListener(Interface), 用来监听HttpSession对象的创建和销毁
- HttpSessionAttributeListener(Interface), 用来监听HttpSession对象属性的变化
- HttpSessionBindingListener(Interface)(感知监听器), 将一个数据绑定到Session, 用来一对一的监听
- HttpSessionActivationListener(Interface), 用来监听Session绑定的对象钝化或者激活的时间
钝化: 把Session绑定的对象持久化到磁盘
激活: 重新读回来再放到Session空间
1.1 ServletContextListener监听器
- 作用: 监听ServletContext创建或销毁(当我们Web应用启动时, 就会创建ServletContext), 即生命周期监听. 应用场景: (1) 加载初始化的配置文件; (2) 任务调度(配合定时器Timer/TimerTask)
- 相关方法
void contextInitialized(ServletContextEvent sce) 创建ServletContext时触发
contextDestroyed(ServletContextEvent sce) 销毁ServletContext时触发
- 应用实例
- 新建java项目
- 导入Web框架
- 引入Servlet-pai.jar包
- 配置Tomcat
- 新建一个java类
- 实现监听器接口
- 业务处理
- 配置web.xml
- 运行结果
1.2 ServletContextAttributeListener监听器
- 作用: 监听ServletContext的属性变化
- 相关方法
void attributeAdded(ServletContextAttributeEvent event)添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event)替换属性时调用
void attributeRemoved( ServletContextAttributeEvent event)移除属性时调用
- 应用实例
- 新建java类, 实现监听器接口
- 处理业务
创建并配置HiServlet, 书写业务逻辑中…
- 配置web.xml
- 运行结果
项目启动时, ServletContext会添加三个默认对象, 被ZzwServletContextAttributeListener 监听到
访问hiServlet
1.3 HttpSessionListener监听器
- 作用: 监听Session创建或销毁, 即生命周期监听(可用于监护用户上线, 离线)
- 相关方法
void sessionCreated(HttpSessionEvent se) 创建session时调用
sessionDestroyed(HttpSessionEvent se)销毁session时调用
- 应用实例
- 新建java类, 实现监听器接口
功能: 监听session的创建和销毁. 监听到有session创建时, 给该session的生命周期设置为30s
改进后(用于监护用户上线, 离线)
- 配置web.xml
- 运行结果
分析: 项目启动后, 会默认进入首页面, 这时会创建两个和系统相关的session, 30s过后, 这两个session被销毁, 被监听器监听到. 或者(如果不想看到它, 清一下控制台点击重新发布, 就没有了)
1.4 HttpSessionAttributeListener监听器
- 作用: 监听Session属性的变化
- 相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用
- 应用实例
- 创建并实现监听器
- 配置web.xml
- 配置Servlet
- 运行结果
1.5 ServletRequestListener监听器
- 作用: 监听Request创建或销毁, 即Request生命周期监听
- 相关方法
void requestInitialized(ServletRequestEvent sre) 创建request时触发
void requestDestroyed(ServletRequestEvent sre) 销毁request时触发
- 可以用来监控某个IP访问我们网站的频率, 记录日志, 访问资源的情况
- 实现监听器
- 配置web.xml
- 运行结果
1.6 其它监听器
1.6.1 ServletRequestAttributeListener
1.6.2 HttpSessionBindingListener
1.6.3 HttpSessionActivationListener
2. Filter过滤器
2.1 过滤器说明
- 过滤器说明
- Filter 过滤器是JavaWeb三大组件之一(Servletcx, Listener监听器, Filter过滤器)
- Filter 过滤器是JavaEE的规范, 是接口
- Filter 过滤器它的作用是: 拦截请求, 过滤响应
- 应用场景
- 权限检查
- 日记操作
- 事务管理
2.2 过滤器基本原理
- 先画图, 清晰思路 => 2. 走代码
2.3 过滤器分析和实例
- 先完成一个正确的流程, 看到一个效果 -> 写后面代码就可以验证
- 加入其它的功能[1.加入session, 验证合法性]
- 创建java项目
- 添加Framework框架
- 添加jar包
- 配置Tomcat
- 先完成一个正确的流程, 同时添加session, 验证合法性
- 配置Filter过滤器
- doFilter()方法
tips: 请求转发的内容并不经过过滤器
如果从login.jsp登录经过LoginCheckServlet请求转发到/manage/admin.jsp页面, 只会调用一次doFilter)(方法, 因为请求转发并不会经过过滤器(即使路径匹配), 但是admin.jsp页面内的图片资源会让浏览器发送获取图片资源的请求, 这是会经过过滤器
tips: 如何判断doFilter()中的servletRequest和admin.jsp中的request内置对象是同一个对象
实验设计: 在login页面登录成功后, 直接在地址栏访问admin.jsp页面, 这样即会走过滤器, 又会访问admin.jsp
实验结果:
tips:
2.4 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的请求均会被拦截
tips: 不能这么配, 这么配即使用户登陆成功也会被拦截
- Filter过滤器它只关心请求的地址是否匹配, 不关心请求的资源是否存在
- 在未登陆的情况下, 请求http://localhost:8085/filter/manage/xxx, 会被拦截器拦截到进入登录页面
- 登录成功后再次访问http://localhost:8085/filter/manage/xxx, 拦截器放行, 请求不到该资源, 将返回404
2.5 Filter生命周期
不同的浏览器调用这个filter, 次数会叠加
2.6 FilterConfig
- FilterConfig说明
- FilterConfig是Filter过滤器的配置类
- Tomcat每次创建Filter的时候, 也会创建一个FilterConfig对象, 这里包含了Filter配置文件的配置信息
- FilterConfig对象作用是获取filter过滤器的配置内容
- 新建ZzwFilterConfig类
- 配置web.xml
2.7 FilterConfig应用实例
- 拦截网段0:0:0:0:0:0:0:1
0:0:0:0:0:0:0:1是ipv6的表现形式,对应ipv4来说相当于127.0.0.1,也就是本机。
2.8 过滤器链基本原理分析
在处理某些复杂业务的时候, 一个过滤器往往不够, 可以设计多个过滤器共同完成任务, 形成过滤器链
2.8.1 过滤链实例演示
- 图
- AFilter.class, BFilter.class
- 配置过滤器
- 运行结果
2.8.2 过滤链注意事项
- 多个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过滤器后置代码->返回给浏览器数据
2.9 过滤器作业布置
- topic.jsp
- showTopic.jsp
- TopicFilter.jsp
web.xml配置
- 运行结果
- 目录结构