세션은 어떻게 할까...창을 닫아버리면 어쩔까...컴터를 끄면 어쩔까...고민하다가...

QnA에서 힌트를 얻어서...만들었습니다...


필요하신 분은 참고하세요~


우선 두개의 테이블을 만들었습니다...


checklog Table

    - ip(접속 ip)

    - id(사용자 id)

    - loginTime(로그인 시간)


duplicatelog Table (중복접속이 일어났을 경우 로그기록을 남기기 위해서 존재)

    - id(사용자 id)

    - date(날짜)

    - ip(접속 ip)


자주 쓰는 테이블은 checklog Table 하나면 됩니다. 중복체크를 로그기록으로 남기지 않으시면, duplicatelog 테이블은 필요 없습니다.


그래서, 로그인 할때 마다


'로그인 중복 방지#################################################################

        ' 현재날짜 구하기

        strYear = Year(now)

        strMonth = cint(Month(now))

        strDay   = cint(Day(now))

        if cint(strMonth) < 10 then

            strMonth = "0" & strMonth

        end if  

        if cint(strDay) < 10 then

            strDay = "0" & strDay

        end if

        cur_date = strYear & "/" & strMonth & "/" & strDay

        ' 현재날짜 구하기 끝


        ip = Request.Servervariables("REMOTE_ADDR")

        Set dblog=Server.CreateObject("ADODB.Connection")

        dblog.open("logEvent")

        sql = "select * from checklog where id='" & id & "'"

        set rsLog = dblog.execute(sql)

'

        if rsLog.EOF or rsLog.BOF then '중복 로그인이 아님

            sql = "insert into checklog (id, ip, loginTime) values ('"&id&"', '"&ip&"', '"&cur_date&"')"

            dblog.execute sql

        else    '중복 로그인

            sql = "update checklog set id='"&id&"', ip='"&ip&"', loginTime='"&cur_date&"'"

            dblog.execute sql

        end if

'

'       사용자 id로 된 데이터가 없으면 insert를 id로 된 데이터가 있으면 update를 시킵니다.


        dblog.close

        set dblog = nothing

'##############################################################################


그리고, 현재 id와 ip가 맞는지 검사 해주면 되겠죠.

중복 방지가 필요한 페이지에서


'로그인 중복 방지#################################################################  

    ip = Request.Servervariables("REMOTE_ADDR")

    Set dblog=Server.CreateObject("ADODB.Connection")

    dblog.open("logEvent")

    sql = "select * from checklog where id='" & session("mem_id") & "'"

    set rsLog = dblog.execute(sql)    

    if rsLog.EOF or rsLog.BOF then '로그온 안되거나 update 안됨

    else

        if rsLog("ip") <> ip then

            sql = "insert into duplicatelog (id, ip, date) values ('" & session("mem_id") & "', '" & ip & "', '" & rsLog("loginTime") & "')"

            dblog.execute sql

            %>

            <script>

                alert("동일 아이디의 사용자가 접속하여 세션이 종료됩니다.");

                location.class='MIME' href="include/login_ok.asp?sw=logout&returnUrl=<%=Request.ServerVariables("URL")&"?"&Request.ServerVariables("QUERY_STRING")%>";

                // 강제로 로그아웃

            </script>

            <%          

        end if

    end if

    dblog.close

    set dblog = nothing

'로그인 중복 방지#################################################################


저장된 ip와 클라이언트의 ip가 다르면 duplicatelog Table에 기록을 하고, 경고창을 내보내면서...강제로 로그아웃 시킵니다.


그러면 새로 접속된 세션은 살아있으면서 기존에 있던 세션이 끊어지게 되겠죠...기존에 세션이 있다면요...


그리고, 별 필요는 없지만...깔끔하게 정리하기 위해


로그아웃 버튼이 눌렸을때


'로그인 중복 방지#################################################################

Set dblog=Server.CreateObject("ADODB.Connection")

dblog.open("logEvent")

sql = "delete from checklog where id='" & session("mem_id") & "'"

dblog.execute sql

'#################################################################################


만들어진 레코드를 지워놓습니다.


물론, 안 지워도 상관은 없구요~


그럼, 도움이 되셨길...^-^;;;

2007/11/22 14:59 2007/11/22 14:59

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다