package org.leeyohn.listener; import java.util.HashMap; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSession; import javax.servlet.ServletContext; import org.leeyohn.User; import org.leeyohn.OnLineUser; public class OnLineUserListener implements HttpSessionListener { //在线注册用户的累加器 private int userCount = 0; //在线游客的累加器 private int visitorCount = 0; @Override public void sessionCreated(HttpSessionEvent se) { System.out.println("sessionCreated"); //获取一个session HttpSession session = se.getSession(); //获取application ServletContext application = session.getServletContext(); System.out.println("创建了一个游客Session"); //包装成一个在线游客信息 OnLineUser onLineUser = new OnLineUser(session.getId(), null, null, null); //获取在线游客的HashMap HashMap<String, OnLineUser> visitorMap = (HashMap<String, OnLineUser>)application.getAttribute("visitormap"); //将访问网站的游客放入Map中 visitorMap.put(session.getId(), onLineUser); //当前在线游客总数 visitorCount = visitorMap.size(); System.out.println(visitorCount); //设置全局的在线游客人数 application.setAttribute("visitorCount", visitorCount); //总人数 application.setAttribute("onLineUserCount", (visitorCount + userCount)); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("sessionDestoryed"); HttpSession session = se.getSession(); ServletContext application = session.getServletContext(); //注册用户 if (session.getAttribute("user") != null) { System.out.println("注销了一个注册用户Session"); User user = (User)session.getAttribute("user"); HashMap<String, OnLineUser> userMap = (HashMap<String, OnLineUser>)application.getAttribute("usermap"); userMap.remove(session.getId()); userCount = userMap.size(); System.out.println(userCount); application.setAttribute("userCount", userCount); } //游客 else { System.out.println("注销了一个游客Session"); HashMap<String, OnLineUser> visitorMap = (HashMap<String, OnLineUser>)application.getAttribute("visitormap"); visitorMap.remove(session.getId()); visitorCount = visitorMap.size(); System.out.println(visitorCount); application.setAttribute("visitorCount", visitorCount); } //总人数 application.setAttribute("onLineUserCount", (visitorCount + userCount)); } } LoginServlet.java文件 import java.util.HashMap; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.servlet.http.Cookie; import javax.servlet.RequestDispatcher; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.JspFactory; import javax.servlet.ServletContext; import java.sql.ResultSet; import org.leeyohn.User; import org.leeyohn.DbDao; import org.leeyohn.OnLineUser; import org.leeyohn.dao.DataSourcePool; public class LoginServlet extends HttpServlet { @Override public void service(HttpServletRequest request , HttpServletResponse response) { //获取session对象 HttpSession session = request.getSession(true); //创建一个application对象 ServletContext application = getServletContext(); String errMsg = ""; try { //获取应用程序名称 String webName = request.getContextPath().substring(1); //用户名 String username = new String(request.getParameter("username").getBytes("iso-8859-1"), "gbk"); //密码 String password = new String(request.getParameter("password").getBytes("iso-8859-1"), "gbk"); //Cookie生存周期 int maxAge = Integer.parseInt(request.getParameter("cookietime")); System.out.println("Cookie生存周期=" + maxAge); System.out.println("应用程序名称=" + webName); DataSourcePool dsp = (DataSourcePool)application.getAttribute("dsp"); ResultSet rs = dsp.query("select user_id, user_name, user_password from user_table where user_name='" + username + "'"); if (rs.next()) { if (rs.getString("user_password").equals(password)) { //调用Model,将用户名密码和ID封装成User对象 User user = new User(rs.getInt(1), username, password); Cookie cookieName = new Cookie(webName + ".loginname", username); Cookie cookiePass = new Cookie(webName + ".loginpass", password); cookieName.setPath("/"); cookiePass.setPath("/"); //设置Cookie对象的保存期限 cookieName.setMaxAge(maxAge); cookiePass.setMaxAge(maxAge); //写入Cookie对象 response.addCookie(cookieName); response.addCookie(cookiePass); //设置session属性,跟踪用户状态 session.setAttribute("user", user); //--------统计在线人数并分别统计在线会员人数和在线游客------- OnLineUser onLineUser = new OnLineUser(session.getId(), user , request.getRemoteAddr(), request.getServletPath()); //获取在线注册用户的HashMap HashMap<String, OnLineUser> userMap = (HashMap<String, OnLineUser>) application.getAttribute("usermap"); //将新登录的注册用户放入Map中 userMap.put(session.getId(), onLineUser); //Map的容量 int userCount = userMap.size(); System.out.println(userCount); //设置全局的在线注册用户人数 application.setAttribute("userCount", userCount); //一次游客访问为session,但登录也是session,要减去游客数量,增加登录用户数量 HashMap<String, OnLineUser> visitorMap = (HashMap<String, OnLineUser>) application.getAttribute("visitormap"); //从游客的Map中移除当前游客 visitorMap.remove(session.getId()); //移除当前游客后的游客数量 int visitorCount = visitorMap.size(); application.setAttribute("visitorCount", visitorCount); //总人数 application.setAttribute("onLineUserCount", (visitorCount + userCount)); request.getRequestDispatcher("/autoturn.jsp").forward(request, response); } else { //用户名密码不匹配 errMsg += "您的用户名密码不符合,请重新输入"; } } else { //用户名不存在 errMsg += "您的用户名不存在,请先注册"; } } catch (Exception e) { e.printStackTrace(); } if (errMsg != null && !errMsg.equals("")) { request.setAttribute("err", errMsg); try { request.getRequestDispatcher("/error.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); } } } }