본문 바로가기

java

[java] 중복로그인 처리

기존 로그인매니저 파일을 수정하여 사용하였습니다. 
기존 테이블은 세션과 로그인 id를 저장하는 용도이며,
추가한 테이블은 ip와 세션주소를 저장하였으며 invalidate시 오류나는상황을 로그아웃시 별도 처리하여 중복로그인을 구분지었습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
 
import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
 
/*
* session이 끊어졌을때를 처리하기 위해 사용
* static메소드에서는 static만사용 하므로static으로 선언한다.
*/
public class LoginManager implements HttpSessionBindingListener{
    private static final Logger logger = LoggerFactory.getLogger( (사용될 로그인controller) .class);
    private static LoginManager loginManager = new LoginManager();
    
    //로그인한 접속자를 담기위한 해시테이블
    private static Hashtable loginUsers = new Hashtable();
    private static Hashtable loginMapping = new Hashtable();
    
    /*
     * 싱글톤 패턴 사용
     */
    public static LoginManager getInstance(){
        return loginManager;
    }
     
    public void valueBound(HttpSessionBindingEvent event) {
        //session값을 put한다.
        loginUsers.put(event.getSession(), event.getName());        
        logger.debug(event.getName() + "님이 로그인 하셨습니다.");
        logger.debug("현재 접속자 수 : " +  getUserCount());
     }
    
     /*
      * 이 메소드는 세션이 끊겼을때 호출된다.(invalidate)
      * Hashtable에 저장된 로그인한 정보를 제거해 준다.
      */
     public void valueUnbound(HttpSessionBindingEvent event) {
         //session값을 찾아서 없애준다.
         logger.debug("  " + event.getName() + "님이 로그아웃 하셨습니다.");
         logger.debug("현재 접속자 수 : " +  getUserCount());
     }
     
     
     /*
      * 입력받은 아이디를 해시테이블에서 삭제. 
      * @param userID 사용자 아이디
      * @return void
      */ 
     public void removeSession(String userId){
          Enumeration e = loginUsers.keys();
          HttpSession session = null;
          while(e.hasMoreElements()){
               session = (HttpSession)e.nextElement();
               if(loginUsers.get(session).equals(userId)){
                   //세션이 invalidate될때 HttpSessionBindingListener를 
                   //구현하는 클레스의 valueUnbound()함수가 호출된다.
                   loginUsers.remove(session);
 
                   //session.setMaxInactiveInterval(0)를 이용하면 된다는데 제대로 안되어서 invalidate()을 사용했다.
                    session.invalidate();
                
               }
          }
     }
     /*
        로그아웃시에는 유저테이블의 내용을 변경했다.     
         */
     public void logoutSession(HttpSession session){
        loginUsers.put(session, "L");
        
     }
     
     
     /*
      * 사용자가 입력한 ID, PW가 맞는지 확인하는 메소드
      * @param userID 사용자 아이디
      * @param userPW 사용자 패스워드
      * @return boolean ID/PW가 일치하는 지 여부
      */
     public boolean isValid(String userId, String userPw){
         
         /*
          * 이부분에 Database 로직이 들어간다.
          */
         return true;
     }
 
 
    /*
     * 해당 아이디의 동시 사용을 막기위해서 
     * 이미 사용중인 아이디인지를 확인한다.
     * @param userID 사용자 아이디
     * @return boolean 이미 사용 중인 경우 true, 사용중이 아니면 false
     */
    public boolean isUsing(String userID){
        return loginUsers.containsValue(userID);
    }
     
    
    /*
     * 로그인을 완료한 사용자의 아이디를 세션에 저장하는 메소드
     * @param session 세션 객체
     * @param userID 사용자 아이디
     */
    public void setSession(HttpSession session, String userId){
        //이순간에 Session Binding이벤트가 일어나는 시점
        //name값으로 userId, value값으로 자기자신(HttpSessionBindingListener를 구현하는 Object)
        session.setAttribute(userId, this);//login에 자기자신을 집어넣는다.
    }
     
     
    /*
      * 입력받은 세션Object로 아이디를 리턴한다.
      * @param session : 접속한 사용자의 session Object
      * @return String : 접속자 아이디
     */
    public String getUserID(HttpSession session){
        return (String)loginUsers.get(session);
    }
    
    //ip값으로 기존 세션정보 조회
    public HttpSession getSessionInfo(String ip){
        return (HttpSession)loginMapping.get(ip);
    }
     
     
    /*
     * 현재 접속한 총 사용자 수
     * @return int  현재 접속자 수
     */
    public int getUserCount(){
        return loginUsers.size();
    }
     
     
    /*
     * 현재 접속중인 모든 사용자 아이디를 출력
     * @return void
     */
    public void printloginUsers(){
        Enumeration e = loginUsers.keys();
        HttpSession session = null;
        logger.debug("===========================================");
        int i = 0;
        while(e.hasMoreElements()){
            session = (HttpSession)e.nextElement();
            logger.debug((++i) + ". 접속자 : " +  loginUsers.get(session));
        }
        logger.debug("===========================================");
     }
     
    /*
     * 현재 접속중인 모든 사용자리스트를 리턴
     * @return list
     */
    public Collection getUsers(){
        Collection collection = loginUsers.values();
        return collection;
    }
    
    public Hashtable getLoginUsers(){
        return this.loginUsers;
    }
    
    public boolean setLoginMapping(HttpServletRequest request, HttpSession session){
        try{
            loginMapping.put(request.getRemoteAddr(), session);
            return true;
        }
        catch(NullPointerException npe){
            logger.error("detail", npe);
            return false;
        }
    }
}


cs


출처: 네이버에서 주웠습니다. 파일 기존파일은 첨부되어있습니다.




'java' 카테고리의 다른 글

[log4j2] log4j2 db 쿼리 출력 / sql 출력  (0) 2017.04.26
화면인쇄페이지  (0) 2016.10.19