개발Story

로그인 구현 중 시큐리티 를 이요하지 하지 않고 세션을 이용한 로그인 구현에서 중복로그인을 구현해보았다.

 

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();
            }
        }
    }
}

 

 

profile

개발Story

@슬래기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!