package kr.kca.pm.main; import java.io.InputStream; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * 동시 접속자 세션관리 HttpListener * /WEB-INF/classes/session.properties 설정파일을 참조 * 동시접속자 허용수를 setting 할 수 있도록 함. (제한접속자 수를 늘려야 할 경우 클래스 Compile없이 사용하도록) * Site 접속시점 세션생성 * Site 로그인시점 세션생성을 분리하여 접속자 수 Counting! * * @author bcchung * @since 2013.07.15 * @version 1.0 * @see * * 개정이력(Modification Information) >> * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2013.07.15 정백철 최초 생성 * */ public class SessionListener implements HttpSessionListener { public static SessionListener sessionManager = null; public static Hashtable sessionMonitor; public static Hashtable loginSessionMonitor; public static int maxSessionValidCount; public SessionListener() { if (sessionMonitor == null) sessionMonitor = new Hashtable(); if (loginSessionMonitor == null) loginSessionMonitor = new Hashtable(); sessionManager = this; Properties prop = new Properties(); try { InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("session.properties"); prop.load(inputStream); } catch (Exception e) { maxSessionValidCount = 300; e.printStackTrace(); } maxSessionValidCount = Integer.parseInt((String) prop.get("maxSessionValidCount")); // System.out.println(" ########################### maxSessionValidCount : " + maxSessionValidCount); } public static synchronized SessionListener getInstance() { if (sessionManager == null) sessionManager = new SessionListener(); return sessionManager; } /** 현재 활성화 된 session의 수를 반환한다. */ public int getActiveSessionCount() { return sessionMonitor.size(); } /** 현재 등록된 session의 id목록을 반환한다. */ public Enumeration getIds() { return sessionMonitor.keys(); } /** 전체 세션갯수를 측정하여 로그인(대기)상태 메세지 창 호출 */ public boolean isMaxLoginSessions() { boolean retVal = false; if(maxSessionValidCount <= getActiveLoginSessionCount()) { retVal = true; } return retVal; } /** 현재 활성화 된 session의 수를 반환한다. */ public int getActiveLoginSessionCount() { return loginSessionMonitor.size(); } /** 로그인한 Session Put */ public void setLoginSession(HttpSession session) { synchronized (loginSessionMonitor) { loginSessionMonitor.put(session.getId(), session); System.out.println(" ############################################################################### "); System.out.println(" # 접속자 (로그인 허용인원수) : " + maxSessionValidCount + " 명#"); System.out.println(" # 접속자 (사이트 접속자수) : " + getActiveSessionCount() + " 명#"); System.out.println(" # 접속자 (로그인 사용자수) : " + getActiveLoginSessionCount() + " 명#"); System.out.println(" ############################################################################### "); } } /** 로그아웃한 Session Remove */ public void setLogoutSession(HttpSession session) { synchronized (loginSessionMonitor) { loginSessionMonitor.remove(session.getId()); } } /** * 현재 등록된 session중 현재 접속된 사용자 정보와 중복 여부 확인 후 중복 접속 이면 이전의 세션을 소멸 시킨다. */ /*public boolean checkDuplicationLogin(String sessionId, String userEeno) { boolean ret = false; Enumeration eNum = sessionMonitor.elements(); System.out.println("session count : " + getActiveSessionCount()); while (eNum.hasMoreElements()) { HttpSession sh_session = null; try { sh_session = (HttpSession) eNum.nextElement(); } catch (Exception e) { continue; } UserModel baseModel = sh_session.getAttribute("UserInfo"); if (baseModel != null) { if (userEeno.equals(baseModel.getUserId_()) && !sessionId.equals(sh_session.getId())) { // 전달 받은 사번과(userEeno) 기존 세션값 중 사번이 중복 되면 // 기존 세션을 소멸 시킨다. // 사용자 로그아웃 이력(중복접속)을 저장한다. try { HashMap param = new HashMap(); param.put("usrId", baseModel.getUserId_()); param.put("ipAddr", baseModel.getRemoteIp_()); param.put("logKind", "LOGOUT"); param.put("logRsn", "DUPLICATE"); // DB 처리 xxxxxxxx.insertLoginLog(param); } catch (Exception e) { e.printStackTrace(); } // 해당 세션 무효화 sh_session.invalidate(); ret = true; break; } } } return ret; }*/ /** 세션 생성시 이벤트 처리 **/ public void sessionCreated(HttpSessionEvent event) { HttpSession session = event.getSession(); synchronized (sessionMonitor) { sessionMonitor.put(session.getId(), session); System.out.println(" ############################################################################### "); System.out.println(" # 접속자 (로그인 허용인원수) : " + maxSessionValidCount + " 명#"); System.out.println(" # 접속자 (사이트 접속자수) : " + getActiveSessionCount() + " 명#"); System.out.println(" # 접속자 (로그인 사용자수) : " + getActiveLoginSessionCount() + " 명#"); System.out.println(" ############################################################################### "); } } /** 세션 소멸(종료)시 이벤트 처리 **/ public void sessionDestroyed(HttpSessionEvent event) { HttpSession session = event.getSession(); synchronized (sessionMonitor) { sessionMonitor.remove(session.getId()); loginSessionMonitor.remove(session.getId()); System.out.println(" ############################################################################### "); System.out.println(" # 접속자 (로그인 허용인원수) : " + maxSessionValidCount + " 명#"); System.out.println(" # 접속자 (사이트 접속자수) : " + getActiveSessionCount() + " 명#"); System.out.println(" # 접속자 (로그인 사용자수) : " + getActiveLoginSessionCount() + " 명#"); System.out.println(" ############################################################################### "); } } }
2014년 1월 3일 금요일
[전자정부] 동시접속 제한을 위한 SessionListener #1
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기