〓소개〓
상식이 있는 사람이라면 ASP를 사용하여 이 기능을 수행하는 것이 분명히 무리라는 것을 알고 있습니다. 왜냐하면 ASP는 QQ, MSN 또는 IRC 채팅방과 같은 인스턴트 메시징이 아니기 때문입니다. 그들은 모두 마지막 활동 시간을 변경하기 위해 웹 페이지를 새로 고쳐야 합니다. 사용자가 온라인 상태인지 알아보기 위해 다음 튜토리얼이 완벽할 것이라고 기대하지 마십시오. 잘못된 것이 있으면 전문가에게 조언을 구하십시오.
------------------------------------- ----------------------------------
〓텍스트〓
우선, 이 효과를 달성하기 위한 저의 생각을 소개하겠습니다. 제 생각을 읽고 이해하실 수 있다면 이 글을 읽을 필요가 없습니다...
이 기능을 구현하는 두 가지 방법만 생각할 수 있습니다.
1. 데이터베이스+ASP
수행하기가 더 복잡할 수 있지만 로그인한 사용자 수가 많은 시스템에 적합합니다.
2. 애플리케이션
애플리케이션 개체 사용: 대규모 커뮤니티를 구축하는 경우 각 로그인 ID에 대해 애플리케이션을 생성해야 할 수 있습니다. 프로그램 설계는 더 간단해지지만 로그인한 사용자가 너무 많아 서버 리소스를 소모하지 않습니다. 여기서 옹호하세요. 사용자가 로그인할 때 응용 프로그램 개체를 생성하기는 쉽지만 사용자가 시스템을 종료할 때 완전히 해제되어야 하기 때문입니다. 지금까지 더 나은 방법을 본 적이 없습니다.
그럼 동일한 계정으로 동시에 로그인이 안되는 문제를 해결하기 위해 데이터베이스 + ASP를 활용하는 방법을 살펴보겠습니다!
먼저 사용자에게 데이터베이스를 생성하도록 요청합니다. 여기서는 액세스를 사용하여 새로운 onlyNet118.mdb를 생성합니다.
데이터 표 1: 사용자는 사용자 등록 정보를 저장합니다.
다음과 같은 데이터 테이블이 설정됩니다. uID(자동 번호) userName(문자 유형) userPass(문자 유형)
데이터 표 2: onlyLogin은 사용자 임시 로그인 정보를 저장합니다.
다음과 같은 데이터 테이블이 설정됩니다. OLname(문자 유형) OLtime(날짜 유형) OLip(문자 유형)
데이터베이스가 구축된 후에는 사용자 테이블에 수동으로 데이터를 직접 추가하고, userName 테이블에 Net118을 추가하고, userPass 테이블에 111을 추가하여 이 기사에서 논의의 초점을 강조하고 불필요한 말도 안되는 비밀번호를 제거합니다. 암호화되어서는 안되며, 사용자 이름은 고유해야 합니다.
이제 데이터베이스에 사용자 데이터베이스가 있습니다. 다음 코드를 복사하여 onlyLogin.asp 파일에 저장해 보겠습니다.
<html>
<머리>
<meta http-equiv=Content-Type content=text/html; charset=gb2312>
<title>Net118.COM은 다른 지역에서 동일한 계정으로 동시 로그인을 금지합니다</title>
</head>
<본문>
<양식 이름=form1 방법=포스트 작업=loginPost.asp>
사용자 이름: <입력 이름=userName 유형=텍스트 id=userName 크기=15 최대 길이=5>
비밀번호: <입력 이름=userPass 유형=비밀번호 id=userPass 크기=15 최대 길이=15>
<입력 유형=제출 이름=제출 값=로그인>
</form>
</body>
</html>
완료 후 새로운 loginCONN.asp 파일을 생성하고 아래 코드를 복사하여 저장하세요! 데이터베이스와 연결되어 있으니 자세한 설명은 생략하겠습니다...
<%
희미한 CONN_Net118
딤콘_T
희미한 mmdd
mmdd=onlyNet118.mdb
CONN_Net118 = Server.CreateObject(ADODB.Connection) 설정
Conn_T=공급자=Microsoft.Jet.OLEDB.4.0;데이터 원본= & Server.MapPath(&mmdd&)
오류 발생 시 다음 재개
CONN_Net118.Conn_T 열기
%>
다음으로 이 디렉터리에도 존재하는 loginPost.asp 파일을 만듭니다. 이는 다음 코드를 주의 깊게 살펴보세요.
<!--#include 파일=loginCONN.asp -->
<%
'maxTime 시간 내에 활성 사용자를 삭제합니다. maxTime은 loginCONN.asp 파일에 정의되어 있습니다.
Conn_Net118.Execute(DATEDIFF('s',OLtime, now()) > & maxTime & )의 onlyLogin에서 삭제
'================================================ = ===============
Dim rs, ts, txt, sql, userName, userPass
Request.Form(Submit)=로그인인 경우
userName=Request.Form(userName)'양식 사용자 로그인 이름 가져오기
userPass=Request.Form(userPass)' 양식 사용자 로그인 비밀번호 가져오기
'여기서는 보안 문제를 논의하지 않기 때문에 사용자 비밀번호는 암호화되지 않습니다.
rs = Server.CreateObject(ADODB.RECORDSET) 설정
sql=SELECT * userName = ' & userName & ' 및 userPass = ' & userPass & '인 FROM 사용자
rs.SQL 열기, CONN_Net118,1,1
rs.eof가 아닌 경우
Call isOK(userName) ' 사용자 이름과 비밀번호가 정확하면 이 프로세스를 호출합니다. isOK는 다음 프로그램에서 사용자 정의됩니다.
또 다른
Response.Write(<a href=javascript:history.go(-1)>잘못된 사용자 이름 또는 비밀번호</a>)
응답.끝()
종료하면
RS.닫기
rs=아무것도 설정하지 않음
종료하면
하위는 괜찮습니다(사용자 이름)
Dim Olip '현재 로그인 사용자 이름으로 데이터베이스에 저장된 IP
Dim Oltime ' 현재 로그인 사용자 이름이 데이터베이스에 저장될 때 웹 페이지를 마지막으로 새로 고친 시간은 사용자가 온라인 상태인지 여부를 계산하는 중요한 데이터입니다.
Dim OLip1 '현재 사용자의 로그인 IP를 기록하여 동일한 사용자인지 구별하는 데 사용됩니다.
OLip1=Request.ServerVariables(REMOTE_ADDR)'로그인 정보를 제출한 사용자의 IP를 가져옵니다.
ts=Conn_Net118.execute 설정(* FROM onlyLogin WHERE OLname='& userName & ' 선택)
if not ts.eof then ' 데이터베이스를 쿼리하여 이 사용자에 대한 로그인 정보가 있는지 확인합니다.
OL시간=ts(OL시간)
OLip=ts(OLip)
if OLip1<>OLip 및 DateDiff(s,OLtime,now()) < maxTime then
'이전 문장은 제출된 로그인 사용자 IP가 데이터베이스에 마지막으로 기록된 사용자 IP가 아닌지 확인하고
'사용자의 마지막 활동 시간과 현재 시간의 차이가 지정된 시간(초)을 초과하지 않으면 사용자가 현재 온라인 상태인 것으로 확인됩니다.
Response.Write <a href=javascript:history.go(-1)>이 사용자는 현재 온라인 상태입니다. 다른 곳에서는 이 계정에 로그인할 수 없습니다! </a>
응답.끝()
또 다른
'그렇지 않으면 로그인이 성공한 것으로 판단하고 해당 값을 세션에 지급합니다.
세션(lgName)=사용자 이름
세션(lgPass)=userPass
응답.로그인 리디렉션OK.asp
응답.종료
종료하면
또 다른
'데이터베이스에 로그인 사용자 기록이 없으면 다음 명령문을 실행합니다.
희미한 ls
ls=Server.CreateObject(ADODB.RECORDSET)를 설정합니다.
ls.OpenSelect * onlyLogin,CONN_Net118,2,2에서
ls.새로 추가
ls(OLname)=사용자 이름
ls(OLip)=OLip1
ls(OLtime)=지금()
ls.업데이트
ls.닫기
ls=아무것도 설정하지 않음
'성공적인 로그인을 확인하고 세션에 값을 지불합니다.
세션(lgName)=사용자 이름
세션(lgPass)=userPass
응답.로그인 리디렉션OK.asp
응답.종료
종료하면
하위 종료 %>
ASP 파일을 이해할 수 있다면 로그인 성공 후 리프가 loginOK.asp로 이동한다는 것을 한눈에 알 수 있습니다. 이 리프의 코드를 즉시 살펴보겠습니다.
<스타일 유형=텍스트/css>
<!--
본문 {배경색: #FF9900;}
-->
</style>
<% IF 세션(lgName)<> 다음 %>
성공적으로 로그인되었습니다! ! ! 다음은 지정된 시간에 웹 페이지를 새로 고치고 온라인 상태인지 서버에 보고하기 위해 웹 페이지에 몰래 들어가는 iframe입니다.
구분을 용이하게 하기 위해 프레임 웹 페이지의 배경색을 흰색으로 사용합니다.
<iframe 테두리=0 이름=new_date marginwidth=0 프레임 간격=0 marginheight=0 src=loginFrame.asp
Frameborder=0 noResize 너비=100 scrolling=no height=30 vspale=0></iframe>
<% 그 외 %>
로그인되어 있지 않습니다. 웹마스터 정보 네트워크: http://www.Net118.com에 오신 것을 환영합니다.
<%는 %인 경우 종료>
주의 깊은 사람이라면 다음에 해야 할 일이 loginFrame.asp라는 것을 즉시 알게 될 것입니다.
<!--#include 파일=loginCONN.ASP -->
<% CONN_Net118.Execute(Update onlyLogin Set OLtime='& NOW() & ' where OLname = ' & Session(lgName) & ') %>
<html><head><meta http-equiv=refresh content=<%=(maxTime-5)%> url=></head></html>
좋아요, 지금까지 프로그램이 완성되었습니다. 이 프로그램의 핵심은 사용자가 온라인인지 확인하는 것입니다. 사용자가 온라인인지 확인하기 위해 정기적으로 새로 고쳐지는 키 리프를 FRAME을 사용하여 중첩할 수밖에 없습니다. 여기서 실제 동작 시 일반 사용자가 볼 수 없도록 iframe의 너비와 높이를 0으로 변경하거나, 메인 프로그램의 웹 페이지 배경색을 동일하게 만들 수 있습니다. 정기적으로 새로 고쳐지는 웹 페이지가 중첩되어 있으면 괜찮을 것입니다.
얼마 전 토론 포럼에서 누군가가 세션이나 쿠키 등을 사용하여 결정할 수 있다고 말하는 것을 보았는데, 그들이 생성한 개체는 자신에게만 작동하고 해당 데이터 콘텐츠는 다른 사용자와 공유할 수 없기 때문에 이는 분명히 불가능합니다. 모두. Appliaction은 이 목적을 달성하기 위한 또 다른 방법이어야 하지만, 동시에 로그인하는 사용자가 많으면 각 사용자마다 최소한 1~3개의 appliaction 개체가 생성될 것이라고 생각했을 때 이 아이디어를 포기했습니다. 서버가 안좋으니 당연히 끌려가겠죠~