로그인 구현 중 시큐리티 를 이요하지 하지 않고 세션을 이용한 로그인 구현에서 중복로그인을 구현해보았다.
login 컨트롤러에
EgovHttpSessionBindingListener listener = new EgovHttpSessionBindingListener();
request.getSession().setAttribute(loginId, listener);
로그아웃 코드에
request.getSession().invalidate();
리스너를 담는다.
listener 는 HttpSessionBindingListener를 구현한 것이다.
public class EgovHttpSessionBindingListener implements HttpSessionBindingListener {
/**
* 사용자의 로그인 세션에 EgovHttpSessionBindingListener가 바인딩될 때 자동 호출되는 메소드로,
* 사용자 세션이 이미 존재하는지를 검사하여 하나의 어플리케이션 내에서 하나의 세션만 유지되도록 한다
* */
@Override
public void valueBound(HttpSessionBindingEvent event) {
if (EgovMultiLoginPreventor.findByLoginId(event.getName())){
//알림창 보내기....
EgovMultiLoginPreventor.invalidateByLoginId(event.getName());
// 두번째 로그인 사용자. 먼저 로그인한 사용자를 로그오프 합니다.
event.getSession().setAttribute("MultiLogin", "second");
}
EgovMultiLoginPreventor.loginUsers.put(event.getName(), event.getSession());
}
/**
*
* 로그아웃 혹은 세션타임아웃 설정에 따라 사용자 세션으로부터
* EgovHttpSessionBindingListener가 제거될 때 자동 호출되는 메소드로,
* 사용자의 로그인 아이디에 해당하는 세션을 ConcurrentHashMap에서 모두 제거한다
* */ session이 invalidate이 실행되면 valueUnboud가 실행된다.
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// 두번째 로그인 사용자. 먼저 로그인한 사용자를 로그오프 합니다.
HttpSession s = event.getSession();
EgovMultiLoginPreventor.loginUsers.remove(event.getName(), event.getSession());
}
}
public class EgovMultiLoginPreventor {
public static ConcurrentHashMap<String, HttpSession> loginUsers = new ConcurrentHashMap<String, HttpSession>();
public static boolean findByLoginId(String loginId){
return loginUsers.containsKey(loginId);
}
public static void invalidateByLoginId(String loginId){
Enumeration e = loginUsers.keys();
while (e.hasMoreElements()){
String key = (String) e.nextElement();
if (key.equals(loginId)){
loginUsers.get(key).invalidate();
}
}
}
}
'java > 유틸' 카테고리의 다른 글
zip utill (0) | 2020.03.02 |
---|---|
File 저장하기. (0) | 2020.03.02 |
Excel로 올라온 19리가 넘는 숫자데이터 controller에서 받기 (0) | 2019.12.15 |
싱글톤 패턴,인스턴스 ,클래스, 객체 (0) | 2019.02.21 |
인터페이스와 추상클래스의 차이점 (0) | 2019.02.21 |