기존 로그인매니저 파일을 수정하여 사용하였습니다.
기존 테이블은 세션과 로그인 id를 저장하는 용도이며,
추가한 테이블은 ip와 세션주소를 저장하였으며 invalidate시 오류나는상황을 로그아웃시 별도 처리하여 중복로그인을 구분지었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 | import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /* * session이 끊어졌을때를 처리하기 위해 사용 * static메소드에서는 static만사용 하므로static으로 선언한다. */ public class LoginManager implements HttpSessionBindingListener{ private static final Logger logger = LoggerFactory.getLogger( (사용될 로그인controller) .class); private static LoginManager loginManager = new LoginManager(); //로그인한 접속자를 담기위한 해시테이블 private static Hashtable loginUsers = new Hashtable(); private static Hashtable loginMapping = new Hashtable(); /* * 싱글톤 패턴 사용 */ public static LoginManager getInstance(){ return loginManager; } public void valueBound(HttpSessionBindingEvent event) { //session값을 put한다. loginUsers.put(event.getSession(), event.getName()); logger.debug(event.getName() + "님이 로그인 하셨습니다."); logger.debug("현재 접속자 수 : " + getUserCount()); } /* * 이 메소드는 세션이 끊겼을때 호출된다.(invalidate) * Hashtable에 저장된 로그인한 정보를 제거해 준다. */ public void valueUnbound(HttpSessionBindingEvent event) { //session값을 찾아서 없애준다. logger.debug(" " + event.getName() + "님이 로그아웃 하셨습니다."); logger.debug("현재 접속자 수 : " + getUserCount()); } /* * 입력받은 아이디를 해시테이블에서 삭제. * @param userID 사용자 아이디 * @return void */ public void removeSession(String userId){ Enumeration e = loginUsers.keys(); HttpSession session = null; while(e.hasMoreElements()){ session = (HttpSession)e.nextElement(); if(loginUsers.get(session).equals(userId)){ //세션이 invalidate될때 HttpSessionBindingListener를 //구현하는 클레스의 valueUnbound()함수가 호출된다. loginUsers.remove(session); //session.setMaxInactiveInterval(0)를 이용하면 된다는데 제대로 안되어서 invalidate()을 사용했다. session.invalidate(); } } } /* 로그아웃시에는 유저테이블의 내용을 변경했다. */ public void logoutSession(HttpSession session){ loginUsers.put(session, "L"); } /* * 사용자가 입력한 ID, PW가 맞는지 확인하는 메소드 * @param userID 사용자 아이디 * @param userPW 사용자 패스워드 * @return boolean ID/PW가 일치하는 지 여부 */ public boolean isValid(String userId, String userPw){ /* * 이부분에 Database 로직이 들어간다. */ return true; } /* * 해당 아이디의 동시 사용을 막기위해서 * 이미 사용중인 아이디인지를 확인한다. * @param userID 사용자 아이디 * @return boolean 이미 사용 중인 경우 true, 사용중이 아니면 false */ public boolean isUsing(String userID){ return loginUsers.containsValue(userID); } /* * 로그인을 완료한 사용자의 아이디를 세션에 저장하는 메소드 * @param session 세션 객체 * @param userID 사용자 아이디 */ public void setSession(HttpSession session, String userId){ //이순간에 Session Binding이벤트가 일어나는 시점 //name값으로 userId, value값으로 자기자신(HttpSessionBindingListener를 구현하는 Object) session.setAttribute(userId, this);//login에 자기자신을 집어넣는다. } /* * 입력받은 세션Object로 아이디를 리턴한다. * @param session : 접속한 사용자의 session Object * @return String : 접속자 아이디 */ public String getUserID(HttpSession session){ return (String)loginUsers.get(session); } //ip값으로 기존 세션정보 조회 public HttpSession getSessionInfo(String ip){ return (HttpSession)loginMapping.get(ip); } /* * 현재 접속한 총 사용자 수 * @return int 현재 접속자 수 */ public int getUserCount(){ return loginUsers.size(); } /* * 현재 접속중인 모든 사용자 아이디를 출력 * @return void */ public void printloginUsers(){ Enumeration e = loginUsers.keys(); HttpSession session = null; logger.debug("==========================================="); int i = 0; while(e.hasMoreElements()){ session = (HttpSession)e.nextElement(); logger.debug((++i) + ". 접속자 : " + loginUsers.get(session)); } logger.debug("==========================================="); } /* * 현재 접속중인 모든 사용자리스트를 리턴 * @return list */ public Collection getUsers(){ Collection collection = loginUsers.values(); return collection; } public Hashtable getLoginUsers(){ return this.loginUsers; } public boolean setLoginMapping(HttpServletRequest request, HttpSession session){ try{ loginMapping.put(request.getRemoteAddr(), session); return true; } catch(NullPointerException npe){ logger.error("detail", npe); return false; } } } | cs |
출처: 네이버에서 주웠습니다. 파일 기존파일은 첨부되어있습니다.
'java' 카테고리의 다른 글
[log4j2] log4j2 db 쿼리 출력 / sql 출력 (0) | 2017.04.26 |
---|---|
화면인쇄페이지 (0) | 2016.10.19 |