본문 바로가기
마루아라는 개발쟁이/ASP

강제종료시 로그아웃 및 중복로그인 체크

by 마루아라 이야기 2022. 12. 6.

중복로그인 체크를 해야하는데 컴포넌트를 만들 시간도 없고, 애플릿을 만들 시간도 없고..
뭐 사실은 만들 자신이 없다는 말이 더 맞겠지만 ㅡㅡ;;;
그래서 아래와 같이 구성했습니다.
onunload 로 페이지를 닫거나 새로고치거나 다른페이지로 이동할 시
이벤트를 잡을 수 있고, 각각의 구분도 할 수 있다는 걸 알고 있는 상태에서
어찌보면 꽁수 일수도 있지만...
하여튼 아래처럼 구성해봤습니다.  결~


1) 화면쪽
common.js나 기타 link된 js파일젤 상단쯤에 아래와 같이 선언
아니면 해당 페이지 마다 <body onunload="exitCd()"> 을 선언해야됨
js파일과 <body의 onunload 이벤트에 동일한 이벤트를 잡았을시 <body 에 있는 이벤트만 적용됨

//----------------------
// 페이지에서 벗어나는 이벤트시 exitCo 함수 호출
// onunload 이벤트는 페이지 닫기, 새로고침, 다른페이지로 이동시 등에 발생)
//----------------------
window.onunload = exitCo;
 
//-------------------------------------------------------------------
// onunload이벤트 발생시 각 상황별 엑션을 나눠줌
// 호출예) onunload 이벤트시 함수 호출
// 설명) 밑의 코드로 강제 창닫기의 이벤트를 잡아낼 수 있으므로,
//       이벤트 발생시 새창을 열고, 창이 열리는 좌표는 모니터상에서 보이지 않는 좌표로 잡아주고,
//       logout_test.jsp는 로그아웃을 하고, 자동으로 창이 닫히는 작업을 한다.
//-------------------------------------------------------------------
function exitCo() {
    //강제 창닫기(x닫기와 Alt+F4 포함)
    if (self.screenTop > 9000) {
            window.open('/logout_test.jsp','win','left=2000,top=2000,width=1,height=1,statusbar=no,scrollbars=yes,toolbar=no,channelmode=no');
    }
    /*
    else {
            if(document.readyState == "complete") {
                    //alert("새로고침");// 새로고침
            }else if(document.readyState == "loading") {
                    //alert("다른사이트 이동");// 다른 사이트로 이동
            }
    }
    */
}


2) 자바쪽
중복로그인 체크는 허광남님이 쓰신 모델2로 다시 배우는 JSP를 참고했습니다.
(OKJSP 사이트에 소스가 있는걸로 알고 있습니다.)
(싱글톤으로 HashTable에 아이디와 SessionId를 담아두고, 비교하는 방식으로 처리)
/**
 * ID 와 PW 이 맞는지 확인하는 메소드
 * @param userID 사용자 아이디
 * @param userPassword 사용자 패스워드
 * @return loginChkStatus 0:없는 아이디, 1:틀린 비밀번호, 2:성공, 3:중복로그인
 * @throws BizException
 */
public String isValid(HttpServletRequest request) throws BizException{
       
    String userId       = CommUtil.nullToEmptyString(request.getParameter("userId")).toUpperCase();
    String userPassword = CommUtil.nullToEmptyString(request.getParameter("userPassword")).toUpperCase();
   
    /* 로그인 체크하는 부분 */
    Hashtable loginUserInfo = DaoLogin.getLoginCheck(userId, userPassword);
   
    String loginChkStatus = (String)loginUserInfo.get("loginChkStatus");

    //로긴이 성공하면 loginUsers 목록에 등록하고, 세션객체를 생성한다.
    if(loginChkStatus.equals(Gubun.LOGIN_OK)){
           
        if(loginManager.isUsing(userId)){
                loginChkStatus = "3";
        }else{
                setSession(request, loginUserInfo);
        }
        loginLogging(request, loginUserInfo);
    }      
    return loginChkStatus;
}

3) logout_test.jsp
/***************************
 *  logout_test.jsp
 *  로그아웃후 자동창닫기
 ***************************/
<%@page session="false" contentType="text/html;charset=euc-kr" import="com.goodmansoft.basic.*" %>
<%
        HttpSession session = request.getSession(false);
       
        if(session != null) {
                session.invalidate();
%>     
<script>
window.close();
</script>

<%
        }
%>

 

 

문제점 >>

중복 로그인 체크에 대해

- Alt+F4로 화면 닫을때는 인식됨
- Ctrl+Alt+Delete로 프로세스를 죽일때는 인식됨
- 파워를 꺼버리면.. 세션이 죽지 않음

 

문제점2>>

중복체크시 주지 시킬점-
1) 페이지를 열고, goodmansoft 로그인한 상태에서 신규페이지를 열고, 로그인을 할 경우에는 중복되었다고 메세지가 뿌려짐
2) 페이즈를 열고,  gooodmansoft 로그인한 상태에서 다른 페이즈로 이동하여, 창을 닫는 경우에는 이벤트가 발생하지 않아서 중복체크에러가 계속 발생함

728x90
반응형
LIST