servlet监听器

来源:互联网 发布:mac如何把桌面的图标 编辑:程序博客网 时间:2024/04/30 10:12

1、监听器的一般作用:统计在线人数和在线用户;系统启动时加载初始化信息;统计网站访问量;跟spring结合

2、servlet监听器按监听对象划分分为三类:

第一、用于监听应用环境对象:ServletContext

第二、用于监听用户会话对象:HttpSession

第三、用于监听请求消息对象:ServletRequest

Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当 增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1。常用的监听接口有以下几个:

    ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
    ServletContextListener 监听ServletContext。当创建ServletContext时,激发contextInitialized (ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。
    HttpSessionListener 监听HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
    HttpSessionAttributeListener 监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded (HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。

监听器使用实例:统计在线用户及人数

//用于保存用户登录信息

public class User {

private String sessionIdString;//sessionID
private String ipString;//请求用户的ip地址
private String firstTimeString;//用户首次请求时间
public String getSessionIdString() {
return sessionIdString;
}
public void setSessionIdString(String sessionIdString) {
this.sessionIdString = sessionIdString;
}
public String getIpString() {
return ipString;
}
public void setIpString(String ipString) {
this.ipString = ipString;
}
public String getFirstTimeString() {
return firstTimeString;
}
public void setFirstTimeString(String firstTimeString) {
this.firstTimeString = firstTimeString;
}
}

//校验当前用户是否已经存在
public class SessionUtil {
public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
if (user.getSessionIdString().equals(sessionIdString)) {
return user;
}
}
return null;
}
}

@WebListener//servlet3.0监听器注解,不用再web.xml文件配置
public class MyServletRequestListener implements ServletRequestListener {


private ArrayList<User> userList;//统计在线登录的用户

@Override
public void requestDestroyed(ServletRequestEvent arg0) {

}

@Override
public void requestInitialized(ServletRequestEvent arg0) {

userList  = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");

if(userList==null)
userList = new ArrayList<User>();

HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
String sessionIdString = request.getSession().getId();

if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){
User user = new User();
user.setSessionIdString(sessionIdString);
user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
user.setIpString(request.getRemoteAddr());
userList.add(user);
}
arg0.getServletContext().setAttribute("userList", userList);
}
}

@WebListener //servlet3.0监听器注解,不用再web.xml文件配置
public class MyHttpSessionListener implements HttpSessionListener {

private int userNumber = 0;//当前在线用户数

@Override
public void sessionCreated(HttpSessionEvent arg0) {
userNumber++;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
}


@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
userNumber--;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);

ArrayList<User> userList = null;//

userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");

if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){
userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));
}

}


}

0 0
原创粉丝点击