JAVAWEB---监听器接口和过滤器接口
目录
监听器接口:
介绍:
- 来自于Servlet规范中
- 专门用于监听【域对象生命周期变化】以及【域对象共享数据变化情况】
- 监听器接口实现类,只能由开发人员负责实现
域对象:
定义:
在某一个范围之内,可以为Servlet之间提供共享数据的对象
分类:
ServletContext application:全局作用域对象,在Tomcat运行期间,可以为当前工程中所有的Servlet提供共享数据
HttpSession session:会话作用域对象,在一次会话过程中,为参与本次会话的Servlet提供共享数据
HttpServletRuest request:请求作用域对象,在一次请求处理过程中,比如【请求转发】,为参与本次请求的所有Servlet提供共享数据
实现步骤:
- 根据监听的目标对象,选择一个合适监听器接口来实现
- 重写监听器接口中监听处理方法
- web.xml注册监听器,通知Tomcat
共享数据变化:
ServletContextAttributeListener
application.setAttribute("key",100);新增共享数据
application.setAttribute("key".200);更新共享数据
application.removeAttribute("key");删除共享数据
监听器应用介绍:
- jdbc操作数据库的时间消耗的地方:
- Connection的创建
- Connection销毁
- JDBC运行时提升数据解决方案
- JDBC运行时,既不创建Connection,也不销毁Connection
- 数据库连接池管理方案
- 在项目启动过程中,预先创建一定数量的Connection
- 在用户来访时,将一个空闲的Connection交给JDBC来使用
- 在用户访问完毕后,将本次使用Connection至于【空闲状态】以备下一个客户使用
- 在项目关闭时,将这些Connection来集中销毁
- 数据库连接池实现难点
- 如何确保Connection在项目运行期间一致处于存活状态:使用application引用这些Connection
- 如何得知项目启动时刻,和项目关闭时刻:使用ServletContextListener
过滤器接口:
介绍:
- 来自于Servlet规范中一个接口
- 过滤器接口可以在请求到达目标资源文件之前进行拦截,从而可以判断【本次请求是否合法】或者【对拦截请求进行增强】
- 过滤器接口实现类需要由开发人员负责实现
实现步骤
- 创建一个Filter接口实现类
- 重写doFilter方法
- 对拦截的请求合法性进行判断
- 对拦截的请求进行增强处理
- web.xml注册过滤器
- 让Tomcat在启动时,负责创建过滤器对象,通知Tomcat,何种请求将会被过滤器拦截处理
进行合法性判断:
通过判断其年龄来判断是否能访问这个图片
用户可以访问该图片
增强
实例:
两个网站都需要UTF-8解析,怎样只写在一个地方,就可以解决?(这样做可以在修改的时候只修改一处即可)
解决方案:
利用过滤器
FilterChain接口:
介绍:
- 接口实现类依然是由Tomcat负责提供
- 本质上就是一个数组
- 数组存放对本次请求进行拦截的所有过滤器对象
- 过滤器链条相当于一个调度,决定哪一个过滤器先执行,哪一个过滤器后执行
实现结果:
Filter 链中各个 Filter 的拦截顺序与它们在 web.xml 文件中 <filter-mapping> 元素的映射顺序一致,由于 MyFilter01 的 <filter-mapping> 元素位于 MyFilter02 的 <filter-mapping> 元素前面,因此,用户的访问请求首先会被 MyFilter01 拦截,然后再被 MyFilter02 拦截。
恶意登录
介绍:
是说用户没有点击页面的按钮,直接通过地址栏来访问
如何解决:
用Session,来访问的时候每次都需要判断一下来访用户是否有Session,是否合法
Session弊端:
- 需要在所有被保护的Servlet中,进行重复性判断处理,增加了冗余开发,必然提高耦合度,增加项目维护难度
- 只能保护动态资源文件,没有办法保护静态资源文件
解决办法:
用过滤器,只需要在过滤器中判断,就可以访问动态资源文件,或者静态资源文件,避免了重复性,修改时,只需要修改一处