java中如何實現同一賬號不能同時登入
阿新 • • 發佈:2020-10-14
經過兩天的研究,下面給兩個方法.不個是webwork版本的,一個是修改過後的網上的意見監聽器版本的 (一) 首先先上自己的研究成果 1:首先在baseAction 中或者直接在action中寫一個方法,和一個靜態map(儲存唯一的session) 靜態map Java程式碼 收藏程式碼 private static Map<String, HttpSession> httpssessionmap = new Hashtable<String, HttpSession>(); //避免重複登入 2:主方法(給一個返回值是為了給提示) Java程式碼 收藏程式碼public Integer loginMethod(LoginInfo loginfo,Users user) throws Exception{ int returnnum=0; if(httpssessionmap.containsKey(user.getUser_code())){ //qztc_LogInfo(user, (String)httpssessionmap.get(user.getUser_code()).getAttribute(LOGIN_IP)); try{//獲取sessionlogger.info("因在其它地方重新登入被系統強制退出"); httpssessionmap.get(user.getUser_code()).removeAttribute(LOGIN_INFO); }catch(Exception e){ e.printStackTrace(); } httpssessionmap.remove(user.getUser_code());if (pcount > 0) pcount--; Thread.sleep(10); returnnum=1; } set(LOGIN_INFO,loginfo); //set(LOGIN_INFO, new LoginInfo(user)); //set(LOGIN_IP, this.getIPAddress()); httpssessionmap.put(user.getUser_code(), getHttpSession()); pcount++; info(getLogPrex_().append("進入系統").toString()); //info(this.LOG_TYPE_LONGIN, "進入系統"); return returnnum; } 3:獲得登入使用者的唯一session Java程式碼 收藏程式碼 protected HttpSession getHttpSession(){ return ServletActionContext.getRequest().getSession(); } 4:set方法,設定session Java程式碼 收藏程式碼 protected void set(String name, Object value) { ActionContext.getContext().getSession().put(name, value); } 5:說明: 最後可以在 使用者登入的action中 調這個baseaction方法...接下來該幹嘛幹嘛去.. (二) 網上哥們給的意見 http://sunxin.org/forum/thread/22787.html(回帖的使用者"鍾愛java ") 應該是忘記session失效的問題了. 先上程式碼(程式碼整理得我都吐血了.) --接下來都是原話 SessionListener.java監聽session的類,部署於/App/WEB-INF/classes/com/test下(其中App為你的應用程式目錄) Java程式碼 收藏程式碼 package com.test; import javax.servlet.http.*; import java.util.*; public class SessionListener implements HttpSessionListener{ private static HashMap hUserName = new HashMap();//儲存sessionID和username的對映 /**以下是實現HttpSessionListener中的方法**/ public void sessionCreated(HttpSessionEvent se){ } public void sessionDestroyed(HttpSessionEvent se) { hUserName.remove( se.getSession().getId() ); } /* * isAlreadyEnter-用於判斷使用者是否已經登入以及相應的處理方法 * @param sUserName String-登入的使用者名稱稱 * @return boolean-該使用者是否已經登入過的標誌 */ public static boolean isAlreadyEnter(HttpSession session,String sUserName,LoginInfo loginfo){ boolean flag = false; if(hUserName.containsValue(sUserName)){ //如果該使用者已經登入過,則使上次登入的使用者掉線(依據使使用者名稱是否在hUserName中) flag = true; //遍歷原來的hUserName,刪除原使用者名稱對應的sessionID(即刪除原來的sessionID和username) Iterator iter = hUserName.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); if( ( (String)val ).equals(sUserName) ){ hUserName.remove(key); } } hUserName.put( session.getId(),sUserName );//新增現在的sessionID和username System.out.println("hUserName = " + hUserName); } else{ //如果該使用者沒登入過,直接新增現在的sessionID和username flag = false; ((ActionContext) session).put(LOGIN_INFO, loginfo); hUserName.put( session.getId(),sUserName ); System.out.println("hUserName = " + hUserName); } return flag; } /* * isOnline-用於判斷使用者是否線上 * @param session HttpSession-登入的使用者名稱稱 * @return boolean-該使用者是否線上的標誌 */ public static boolean isOnline(HttpSession session){ boolean flag = true; if( hUserName.containsKey( session.getId() ) ){ flag = true; } else{ flag = false; } return flag; } } web.xml部署於/App/WEB-INF下 Xml程式碼 收藏程式碼 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> <web-app> <listener> <listener-class> com.inspirer.dbmp.SessionListener </listener-class> </listener> </web-app> 應用部分 1.在你的登入驗證時,呼叫SessionListener.isAlreadyEnter(session,"admin") 既可以判斷該使用者名稱的使用者是否登入過,又可以使上次登入的使用者掉線 2.其他頁面呼叫SessionListener.isOnline(session),可以判斷該使用者是否線上.