サーバサイド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;
}