1,jsp提交一个form
2,把收集到的数据放到一个personInfo类中,personInfo类放进session中
3,添加的时候触发listener,把一个personInfo的account为key ,session为value,放进一个map中,如果在map找到了这个session,
证明他已经登陆了,把他弄下线。map重新添加
计算在线人数用一个装满常量的类
1,map的size()就是在线的人数
登陆页面jsp
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ page import="listen.PersonInfo"%> <% String action = request.getParameter("action"); String account = request.getParameter("account"); if ("login".equals(action) && account.trim().length() > 0) { PersonInfo personInfo = new PersonInfo(); personInfo.setAccount(account); personInfo.setIp(request.getRemoteAddr()); personInfo.setLoginDate(new java.util.Date()); session.setAttribute("personInfo", personInfo); response.sendRedirect(response.encodeRedirectURL(request .getRequestURI())); return; } else if ("logout".equals(action)) { System.out.println("outout"); session.removeAttribute("personInfo"); response.sendRedirect(response.encodeRedirectURL(request .getRequestURI())); return; } %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <% if (session.getAttribute("personInfo") != null) { %> 欢迎你, ${personInfo.account }. <br /> 你的登陆ip, ${personInfo.ip }. <br /> 登陆时间 , ${personInfo.loginDate }. <a href="${contextPage.request.requestURI }?action=logout">退出</a> <script> setTimeout("location=location;", 5000); </script> <% } else { %> ${msg } <form action="${contextPage.request.requestURI }?action=login" method="post"> 账号: <input name="account" /> <input type="submit" value="登陆"> <from /> <% } %> </body> </html>
单点登录
package listen; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class LoginSessionListener implements HttpSessionAttributeListener { Log log = LogFactory.getLog(this.getClass()); Map<String, HttpSession> map = new HashMap<String, HttpSession>(); @Override public void attributeAdded(HttpSessionBindingEvent event) { // TODO Auto-generated method stub String name = event.getName(); if (name.equals("personInfo")) { PersonInfo personInfo = (PersonInfo) event.getValue(); if (map.get(personInfo.getAccount()) != null) { HttpSession session = map.get(personInfo.getAccount()); PersonInfo oldPersonInfo = (PersonInfo) session .getAttribute("personInfo"); log.info("账号: " + oldPersonInfo.getAccount() + "被迫下线"); session.removeAttribute("personInfo"); session.setAttribute("msg", "你的账号被其他机器登陆了"); } map.put(personInfo.getAccount(), event.getSession()); log.info("账号:" + personInfo.getAccount() + "在" + personInfo.getIp() + "登陆"); } } @Override public void attributeRemoved(HttpSessionBindingEvent event) { // TODO Auto-generated method stub String name = event.getName(); if ("personInfo".equals(name)) { PersonInfo personInfo = (PersonInfo) event.getValue(); log.info("账号" + personInfo.getAccount() + "注销"); } } @Override public void attributeReplaced(HttpSessionBindingEvent event) { // TODO Auto-generated method stub } }
在线人数
package listen; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener, HttpSessionAttributeListener { @Override public void sessionCreated(HttpSessionEvent se) { // TODO Auto-generated method stub Count.TOTAL_HISTORY_COUNT++;// 总访问人数加一 Count.SESSION_MAP.put(se.getSession().getId(), se.getSession());// 放进去 if (Count.SESSION_MAP.size() > Count.MAX_ONLINE_COUNT) { Count.MAX_ONLINE_COUNT = Count.SESSION_MAP.size(); } } @Override public void sessionDestroyed(HttpSessionEvent se) { // TODO Auto-generated method stub HttpSession session = se.getSession(); Count.SESSION_MAP.remove(session.getId()); } @Override public void attributeAdded(HttpSessionBindingEvent event) { // TODO Auto-generated method stub if ("personInfo".equals(event.getName())) { Count.CURRENT_LOGIN_COUNT++;// 当前在线人数加一 HttpSession session = event.getSession(); } } @Override public void attributeRemoved(HttpSessionBindingEvent event) { // TODO Auto-generated method stub if (event.getName().equals("personInfo")) { Count.CURRENT_LOGIN_COUNT--; } } @Override public void attributeReplaced(HttpSessionBindingEvent event) { // TODO Auto-generated method stub } }