サーバサイドJava 多重ログイン禁止
セッションとクラス変数を使ってサーブレットの多重ログイン禁止に挑戦してみた。ネットを探してみてもサンプルソースが見つけられず、おかなしなことをしていないかあんまり自信ない。
ログインユーザー保持クラス
import java.util.Hashtable; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; public class UserHolder implements HttpSessionBindingListener { private static Hashtable _login = new Hashtable(); private Integer _userId; private String _sessionId; public UserHolder(int userId, String sessionId) { _userId = new Integer(userId); _sessionId = sessionId; _login.put(_userId, sessionId); } public void valueBound(HttpSessionBindingEvent arg0) { } public void valueUnbound(HttpSessionBindingEvent arg0) { if (_login.containsKey(_userId) && _sessionId.equals(_login.get(_userId))) { _login.remove(_userId); } } public static boolean isValid(int userId, String sessionId) { Integer id = new Integer(userId); return _login.containsKey(id) && sessionId.equals(_login.get(id)); } }
ログイン時
HttpSession session = request.getSession(true); session.removeAttribute("login"); session.setAttribute("login", new UserHolder(userId, session.getId()));
チェック時
HttpSession session = request.getSession(false); if (session == null || !UserHolder.isValid(id, session.getId())) { if (session != null) { session.removeAttribute("login"); } //エラー処理 return; }