监听器与过滤器
2017-09-28 18:17:44 2 举报
AI智能生成
Servlet知识结构图
作者其他创作
大纲/内容
④:监听器介绍
用于监听java对象方法的调用或属性的改变
事件源、事件对象【封装了事件源和动作】、监听器
当事件源发生某些变化时,会调用监听器的方法,同时把事件源对象传递进去。那么监听器就可以通过事件对象操作事件源数据
⑥:Servlet的监听器
Servlet的监听器和我们自定义的有些不同。
我们自定义的是在事件源上注册监听器。Servlet的监听器是Web服务器注册好了
我们只需要在web.xml文件中配置对应的listener即可!
Servlet监听无非就是Context、Session、request对象
监听对象的创建与销毁
监听域属性的创建与销毁
在监听Session时还多了两个功能
HttpSessionBindingListener:监听JavaBean对象自己是否被添加到Session中【跟监听Session域差不多】
HttpSessionActivationListener:监听JavaBean对象自己在Session中什么时候钝化和活化
⑦:监听器应用
统计网站在线人数
Session第一次被创建了,那么在线人数就+1
Session被销毁了,那么在线人数就-1
在线人数是全站的数据,保存在Context中
自定义Session扫描器
如果Session长时间没有使用,就应该被销毁【Web服务器的时间做得不够精确,我们使用程序来手动删除】
得到整个站点的Session,Session一创建就使用一个集合装载起来。
想要每个一段时间去检查一下Session到时了没有【当前时间-上次活跃时间】,就需要定时器
定时器在服务器一启动的时候就要执行,因此在监听Context创建的时候执行监听器就对了。
该程序还可能涉及到了并发访问的问题【Session添加到集合与遍历Session会并发】,需要注意同步
踢人小案例
使用集合装载所有的在线用户,集合在Context域中保存着
监听是否有属性添加到Session中,并且类型是user的。如果是,说明这个是在线用户
监听Session创建,只代表着有用户访问了资源。监听Session属性的变化,就可以判断用户具体的操作了
⑤:自定义监听器
1、定义监听器,监听器为接口,监听的方法需要事件对象参数
2、定义事件源,需要注册监听器。也就是说,在事件源上需要维护监听器对象。同时,事件源也应该有对应的方法
3、定义事件对象,事件对象封装了事件源
使用①:首先要注册监听器,监听器是一个接口,那么就需要实现对应的监听方法
使用②:通过监听方法的参数,得到事件对象。事件对象又封装了事件源。那么就可以操作事件源了。
Servlet高级特性
①:过滤器
过滤器顾名思义就是过滤某一些东西,当然也可以理解成【规定了某些数据,对其他数据进行过滤】
实现Filter类的就是一个过滤器
doFilter()的执行顺序
过滤器放行之后,会执行下一个过滤器【如果有多个过滤器】
如果只有一个过滤器,那么就执行用户访问的目标资源
如果doFilter()后边还有其他的代码,那么执行完目标资源,还会执行doFilter()后边的代码的
②:过滤器的简单应用
2、在让目标资源执行之前,可以对request\esponse作预处理,再让目标资源执行
3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
简单应用之一:禁止浏览器缓存所有动态页面
将request的消息头设置为不缓存,把request对象传递进去给doFilter()即可
简单应用之二:实现自动登陆
1、判断有没有Session
2、如果有Session,那么就不用自动登陆了【因为已经登陆了】
3、如果没有Session,得到Cookie的值【Cookie就是保存着用户名与密码,密码使用md5加密】
4、拿到用户名与密码,就调用service去登陆,并且存放Session标记
③:过滤器高级应用
编码过滤器【解决全站中文乱码】
普通的request对象并不能解决以get方法传递过来中文数据的乱码问题
于是乎,我们就需要对request对象进行增强!
使用包装设计模式
使用动态代理技术
拿到中文数据是乱码的主要原因是getParameter()方法,因此只需要增强getParameter()方法即可
过滤敏感词
当用户发送一些敏感词的时候,我们是不允许它显示在网页上的
用户提交数据,Servlet都是通过getParameter()方法得到数据的
在得到数据的时候,只要判断拿到的数据有没有敏感词汇,如果有,替换即可
因此,还是增强request对象
压缩资源过滤器
压缩服务器输出给浏览器的数据,主要是response对象
调用response对象的write()方法时,不把数据直接输出给浏览器,先缓存起来,压缩后输出
ServletOutputSteam调用write()方法也是需要我们自己增强的!
PrintWriter本来就是一个包装类,直接在构造方法中就可以让write()方法写到我们想要的地方了
HTML转义过滤器
也是通过getParameter()获取得到数据,对数据进行转义即可
缓存数据到内存中
服务器输出到浏览器的数据用一个数组缓存起来【增强response对象】
使用一个Map集合装载着这些缓存的数组
用户发送请求的时候,看看请求的URI有没有对应的数组,如果有就直接返回数组的数据
更多脑图和最新原创技术文章可关注公众号:Java3y
0 条评论
回复 删除
下一页