출처 : http://blog.naver.com/korekiss/20038228350
HttpSessionBindingListener 는 웹에서 동시 사용자의 수 또는 하나의 아이디로 동시접속을 제한 할때 유용한 인터페이스 이다. HttpSessionBindingListener 는 두개의 메소드를 지니는데 valueBound() 와 valueUnbound() 메소드 이다.
HttpSessionBindingListener 는 웹에서 동시 사용자의 수 또는 하나의 아이디로 동시접속을 제한 할때 유용한 인터페이스 이다. HttpSessionBindingListener 는 두개의 메소드를 지니는데 valueBound() 와 valueUnbound() 메소드 이다.
valueBound() 는 HttpSessionBindingListener 클래스의 인스턴스가 세션에 attribute로
등록될떄 호출된다 session.setAttribute(플래그, 값)
valueUnbound()는 session.removeAttribute(플래그); 사용시
또는 세션종료시 session.invalidate()호출된다.
다음은 이를 이용한 동시 사용자및 중복 로그인 방지 프로그램이다.
LoginManager.java
package cookie;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionBindingEvent;
import java.util.Hashtable;
import java.util.Enumeration;
public class LoginManager implements HttpSessionBindingListener
{
private static LoginManager loginManager = null;
private static Hashtable loginUsers = new Hashtable();
private LoginManager(){
super();
}
public static synchronized LoginManager getInstance(){
if(loginManager == null){
loginManager = new LoginManager();
}
return loginManager;
}
//아이디가 맞는지 체크
public boolean isValid(String userID, String userPW){
return true; //자세한 로직은 미구현
}
//해당 세션에 이미 로그인 되있는지 체크
public boolean isLogin(String sessionID){
boolean isLogin = false;
Enumeration e = loginUsers.keys();
String key = "";
while(e.hasMoreElements()){
key = (String)e.nextElement();
if(sessionID.equals(key)){
isLogin = true;
}
}
return isLogin;
}
//중복 로그인 막기 위해 아이디 사용중인지 체크
public boolean isUsing(String userID){
boolean isUsing = false;
Enumeration e = loginUsers.keys();
String key = "";
while(e.hasMoreElements()){
key = (String)e.nextElement();
if(userID.equals(loginUsers.get(key))){
isUsing = true;
}
}
return isUsing;
}
//세션 생성
public void setSession(HttpSession session, String userID){
loginUsers.put(session.getId(), userID);
session.setAttribute("login", this.getInstance());
}
//세션 성립될 때
public void valueBound(HttpSessionBindingEvent event){
}
//세션 끊길때
public void valueUnbound(HttpSessionBindingEvent event){
loginUsers.remove(event.getSession().getId());
}
//세션 ID로 로긴된 ID 구분
public String getUserID(String sessionID){
return (String)loginUsers.get(sessionID);
}
//현재 접속자수
public int getUserCount(){
return loginUsers.size();
}
};
Bind_login.jsp
<%@ page contentType="text/html;charset=euc-kr"
import="cookie.LoginManager"%>
<% LoginManager loginManager = LoginManager.getInstance(); %>
<html>
<body>
<center>
현재 접속자수 : <%= loginManager.getUserCount() %><p>
<hr>
<%
if(loginManager.isLogin(session.getId())){ //세션 아이디가 로그인 중이면
out.println(loginManager.getUserID(session.getId())+"님 안녕하세요<br>"
+"<a href=bind_logout.jsp>로그아웃</a>");
}
else{ //그렇지 않으면 로그인 할 수 있도록
%>
<form name="login" action="bind_login_ok.jsp">
아이디: <input type="text" name="userID"><br>
비밀번회: <input type="text" name="userPW"><br>
<input type="submit" value="로그인">
</form>
<% }%>
</center>
</body>
</html>
Bind_login_ok.jsp
<%@ page contentType="text/html;charset=euc-kr"
import="cookie.LoginManager"%>
<% LoginManager loginManager = LoginManager.getInstance(); %>
<%
request.setCharacterEncoding("euc-kr");
String userID = request.getParameter("userID");
String userPW = request.getParameter("userPW");
if(loginManager.isValid(userID, userPW)){
if(!loginManager.isUsing(userID)){
loginManager.setSession(session, userID);
response.sendRedirect("bind_login.jsp");
}
else{
throw new Exception("이미 로그인중");
}
}
else{
throw new Exception("ID/PW 이상");
}
%>
Bind_logout.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<%
session.invalidate();
response.sendRedirect("bind_login.jsp");
%>