java中應用session監聽完成同帳號登錄限制、登錄人數限制。本站提示廣大學習愛好者:(java中應用session監聽完成同帳號登錄限制、登錄人數限制)文章只能為提供參考,不一定能成為您想要的結果。以下是java中應用session監聽完成同帳號登錄限制、登錄人數限制正文
本文重要引見了java中應用session監聽完成同帳號登錄限制、登錄人數限制,詳細代碼以下:
成績域:
1、同帳號登錄:若此帳號已登錄,弗成再次登錄(與QQ形式相反)。
2、登錄人數限制,跨越、已達人數限制則提醒:體系忙碌,稍後再試。
處理思緒:應用HttpSessionAttributeListener監聽器(固然我同時應用了HttpSessionListener不外感到欠好操作)
常識貯備:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeWordStr3個辦法。
對session的setAttribute、removeAttribute將觸發attributeAdd、attributeRemove辦法,對統一個session的統一個attribute停止反復設置將觸發attributeWordStr辦法。
HttpSessionListener欠好操作的緣由:只需拜訪jsp頁面便會創立session(拜訪html其實不會創立session,在server端,如servlet中挪用HttpServletRequest.getSession(true)才會創立),jsp是靜態頁,實質就是個servlet。我的login.jsp明顯是個jsp,當我在監聽器中invalidate一個session,前往登錄頁,立時就又創立了一個session。這是我感到不清晰的處所,工夫沒抵家。
詳細完成:
監聽器代碼
public class OnlineListener implements HttpSessionListener, HttpSessionAttributeListener { private static List<SessionAndUser> sessions; static int delS = -1; static boolean flag = false; static { if (sessions == null) { sessions = Collections .synchronizedList(new ArrayList<SessionAndUser>()); } } public void sessionCreated(HttpSessionEvent hse) { System.out.println(hse.getSession() + "-" + new Date()); System.out.println(hse.getSession() + "-" + new Date()); } public void sessionDestroyed(HttpSessionEvent hse) { System.out.println("-------------sessionDestroyed()-----------"); System.out.println(hse.getSession() + " " + new Date(hse.getSession().getLastAccessedTime())); System.out.println(hse.getSession() + " " + new Date()); } public void attributeAdded(HttpSessionBindingEvent e) { System.out.println("-------------*start added*-----------------------" + sessions.size()); HttpSession session = e.getSession(); ActionContext ctx = ActionContext.getContext(); boolean newOne = true; String attrName = e.getName(); // 登錄 if (attrName.equals(Constant.USER_NAME)) { // 檢討登錄人數 if (sessions.size() >= Constant.USER_LIMIT) { newOne = false; ctx.put("timeoutMSG", "serverBusy"); } String nowUser = (String) e.getValue(); // 遍歷一切session,檢討能否曾經登錄,若是則提醒曾經登錄 for (int i = sessions.size() - 1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserName().equals(nowUser)) { newOne = false; ctx.put("timeoutMSG", "beenLoged");// tem.getSession().invalidate();// // 同賬號頂替登錄,主動挪用remove break; } } // 新登錄帳號添加進賬戶保護列表 if (newOne) { SessionAndUser sau = new SessionAndUser(); sau.setUserName(nowUser); sau.setSession(session); sau.setSid(session.getId()); sessions.add(sau); } } } public void attributeRemoved(HttpSessionBindingEvent e) throws IllegalStateException { HttpSession session = e.getSession(); System.out .println("-------------*start Removed*-----------------------" + sessions.size()); if (delS > -1) { if (flag) { sessions.remove(delS); flag = false; } } else { // 登錄 String attrName = e.getName(); if (attrName.equals(Constant.USER_NAME)) { String nowUser = (String) e.getValue(); // 遍歷一切session for (int i = sessions.size() - 1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserName().equals(nowUser)) { sessions.remove(i); break; } } } } } public void attributeWordStrd(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out .println("-------------*start replace*-----------------------" + sessions.size()); String attrName = e.getName(); delS = -1; // 登錄 if (attrName.equals(Constant.USER_NAME)) { // User nowUser = (User) e.getValue();//old value String nowUser = (String) session.getAttribute(Constant.USER_NAME);// 以後session中的user // 遍歷一切session for (int i = sessions.size() - 1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserName().equals(nowUser) && !tem.getSid().equals(session.getId())) { System.out.println("Remove:invalidate 1!"); delS = i; flag = true; } else if (tem.getSid().equals(session.getId())) { tem.setUserName(nowUser); } } if (delS != -1) { sessions.get(delS).getSession().invalidate();// 掉效時主動挪用了remove辦法。也就會把它從sessions中移除 } } } }
代碼重要思緒是界說一個靜態List<SessionAndUser>寄存session和帳號稱號。
登錄的Action中取得監聽器前往值並處置的代碼
session.setAttribute(Constant.USER_NAME, operator.getUsername()); ActionContext ctx = ActionContext.getContext(); if("serverBusy".equals(ctx.get("timeoutMSG"))){ ctx.put("timeoutMSG", "辦事器忙碌,請稍後再試"); return "jump"; } if("beenLoged".equals(ctx.get("timeoutMSG"))){ ctx.put("timeoutMSG", "此賬戶在別處登錄"); return "jump"; }
頁面捕捉提醒信息代碼
<%@taglib prefix="s" uri="/struts-tags"%> <s:property value="#attr.timeoutMSG" />
感激浏覽,願望能贊助到年夜家,感謝年夜家對本站的支撐!