좋은지식/잡학다식

[Java] Redis Session 중복로그인 방지 구현

알라르방 2022. 7. 8. 22:33

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionAttributeListener ;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

@WebListener
public class SessionConfig implements HttpSessionListener, HttpSessionAttributeListener {

    private static final Map<String, HttpSession> sessions = new ConcurrentHashMap<>();

    public synchronized static String getSessionidCheck(String type, String compareId){
        String result = "";
        for( String key : sessions.keySet() ){
            HttpSession hs = sessions.get(key);
            if(hs != null &&  hs.getAttribute(type) != null && hs.getAttribute(type).toString().equals(compareId) ){
                result =  key.toString();
                removeSessionForDoubleLogin(result);
            }
        }
        return result;
    }

    private static void removeSessionForDoubleLogin(String sessionId){    
        if(sessionId!= null && sessionId.length() > 0){
            sessions.get(sessionId).invalidate();
            sessions.remove(sessionId);    
        }
    }

    @Override

    public void attributeAdded(HttpSessionBindingEvent se){

        String attributeName = se.getName();

        if("userKey".equals(attributeName)) {

            sessions.put(se.getSession().getId(), se.getSession());

        }

    }

 

    @Override
    public void sessionCreated(HttpSessionEvent se) {
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        if(sessions.get(se.getSession().getId()) != null){
            sessions.get(se.getSession().getId()).invalidate();
            sessions.remove(se.getSession().getId());
        }
    }
}

반응형