监听器就类似于js里面的事件,比如鼠标点击事件,键盘事件等。触发就有响应。同样它也是一个普通的java类实现了一个接口ServletRequestListenner,才变成监听器。
同样也有request,response,session,application等多个监听器。实现对不同会话范围的监听。
- 制作监听器,
1.定义一个类,让这个类实现监听器接口
2.实现抽象方法,这个方法的名字就表示了这个方法什么时候执行!
其实就是时间
监听器做好了之后,需要在web.xml中配置
当打开浏览器,访问页面的时候会话就开始了,监听器也开始监听会话,但是监听什么时候结束了?关掉浏览器监听器还是没有结束,我们知道当第一次会话的时候服务器会给客户端发送一个叫jsessionid的cookie。当我们关闭浏览器,客户端的jsessionid销毁了,但是服务器端的没有销毁,所以认定监听器还没有执行完毕,这个jsessionid在服务器端默认保存时间30分钟,30分钟过后就会自动销毁,监听器也就执行完了。但是我们也可以在客户端这边手动销毁jsessionid,需要使用
session.invalidate
每次开客户端浏览器,确实会触发sessionCreated方法,但是关闭浏览器不会让会话销毁,必须调用session.invalidate才能销毁i会话,从而触发sessionDestoryed方法。
致此我们可以利用监听器销毁jsessionid(安全退出)才算退出的原理,可以统计当前在线人数
package com.z.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyListener implements HttpSessionListener{
private int count=0;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("会话创建了");
count++;
System.out.println("在线人数"+count+"个");
se.getSession().getServletContext().setAttribute("count",count);
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("会话销毁了");
System.out.println("在线人数"+count+"个");
se.getSession().getServletContext().setAttribute("count",count);
}
}
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
- 过滤器里面处理缓存
禁止浏览器缓存所有动态页面的过滤器:
1,有3个HTTP响应头字段都可以禁止浏览器缓存当前页面,他们在Servlet中的代码如下:
response.setDateHeader("Expires",-1);//指定昂也在缓存中的过期时间
response.setHeader("Cache-Control","no-cache");//http消息头,控制网页的缓存
response.setHeader("Cache-Control","no-store")//禁止浏览器缓存
response.setHeader("Pragma","no-cache");//禁止浏览器从缓存中浏览页面类容