〓はじめに〓
ある程度の常識がある人なら誰でも、ASP を使用してこの機能を実行するのは明らかに突飛であることを知っています。ASP は QQ、MSN、または IRC チャット ルームのようなインスタント メッセージングではないためです。これらはすべて、最終アクティビティ時刻を変更するために Web ページを更新することに依存しています。ユーザーがオンラインであるかどうかを取得するため、次のチュートリアルが完璧であるとは期待しないでください。何か間違っている場合は、専門家にアドバイスを求めてください。
-------------------------------------------------- ----------------------------------
〓本文〓
まず、この効果を実現するための私のアイデアを紹介します。私のアイデアを読んで理解できる場合は、この記事を読む必要はありません。
この関数を実装するには 2 つの方法しか思いつきません。
1.データベース+ASP
実行はより複雑になる可能性がありますが、多数のログイン ユーザーがいるシステムに適しています。
2.応用
アプリケーション オブジェクトを使用する: 大規模なコミュニティを構築している場合は、ログイン ID ごとにアプリケーションを生成する必要がある場合がありますが、プログラムの設計は単純になりますが、ログイン ユーザーが多すぎるため、サーバー リソースが消費されることはありません。ユーザーがログインするときにアプリケーションオブジェクトを生成するのは簡単ですが、ユーザーがシステムを終了するときに完全に解放する必要があるため、これより良い方法を今のところ見たことがありません。
そこでデータベース+aspを使って同じアカウントで同時にログインできない問題を解決する方法を見ていきましょう!
まず、ユーザーにデータベースを作成するよう依頼します。ここでは、access を使用して新しいonlyNet118.mdbを作成します。
データ表 1: users はユーザー登録情報を保存します
以下のデータテーブルが設定されています: uID (自動番号) userName (文字タイプ) userPass (文字タイプ)
データ テーブル 2:onlyLogin はユーザーの一時的なログイン情報を保存します
以下のデータテーブルが設定されています。 OLname (文字型) OLtime (日付型) OLip (文字型)
データベースの構築後、この記事での議論の焦点を強調し、不要なナンセンスであるパスワードを削除するために、手動で users テーブルにデータを直接追加し、userName テーブルに Net118 を追加し、userPass テーブルに 111 を追加します。暗号化しないで、ユーザー名は独自のものにする必要があります。
これで、データベースにユーザー データベースが作成されました。次のコードをコピーして、onlyLogin.asp ファイルに保存します。
<html>
<頭>
<meta http-equiv=コンテンツタイプ content=text/html;
<title>Net118.COM は、異なる地域からの同じアカウントの同時ログインを禁止します</title>
</head>
<本文>
<フォーム名=form1 メソッド=ポストアクション=loginPost.asp>
ユーザー名: <input name=userName type=text id=userName size=15 maxlength=5>
パスワード: <入力名=userPass type=password id=userPass size=15 maxlength=15>
<入力タイプ=送信名=送信値=ログイン>
</form>
</body>
</html>
完了したら、新しいloginCONN.aspファイルを作成し、以下のコードをコピーして保存します。データベースに接続されていますので、これ以上は説明しません...
<%
ディムCONN_Net118
ディムコン_T
薄暗いmmdd
mmdd=onlyNet118.mdb
CONN_Net118 = Server.CreateObject(ADODB.Connection) を設定します。
Conn_T=Provider=Microsoft.Jet.OLEDB.4.0;データ ソース= & Server.MapPath(&mmdd&)
エラー時は次から再開
CONN_Net118.Open Conn_T
%>
次に、このディレクトリに存在する loginPost.asp ファイルを作成します。これはより重要です。次のコードをよく見てください。
<!--#include file=loginCONN.asp -->
<%
'maxTime 時間以内にアクティブなユーザーを削除します。maxTime はloginCONN.asp ファイルで定義されています
Conn_Net118.Execute(DATEDIFF('s',OLtime,now()) > & maxTime & ) の場合のみログインから削除
'================================================ = ===============
Dim rs、ts、txt、sql、userName、userPass
Request.Form(Submit)=ログインの場合
userName=Request.Form(userName)'フォームユーザーのログイン名を取得
userPass=Request.Form(userPass)' フォームユーザーのログインパスワードを取得
「ここではセキュリティの問題については議論しないので、ユーザーのパスワードは暗号化されません。
Set rs = Server.CreateObject(ADODB.RECORDSET)
sql=SELECT * FROM users where userName = ' & userName & ' and userPass = ' & userPass & '
rs.Open SQL、CONN_Net118,1,1
rs.eof でない場合
Call isOK(userName) ' ユーザー名とパスワードが正しい場合にこのプロセスを呼び出すと、次のプログラムで isOK がカスタマイズされます。
それ以外
Response.Write(<a href=javascript:history.go(-1)>ユーザー名またはパスワードが間違っています</a>)
Response.End()
終了する場合
rs.閉じる
rs=何も設定しない
終了する場合
サブはOK(ユーザー名)
Dim Olip '現在のログイン ユーザー名によってデータベースに保存されている IP
Dim Oltime ' 現在のログイン ユーザー名がデータベースに保存されているときに Web ページが最後に更新された時刻は、ユーザーがオンラインであるかどうかを計算するための重要なデータです。
Dim OLip1 '現在のユーザーのログイン IP を記録し、同じユーザーかどうかを区別するために使用します。
OLip1=Request.ServerVariables(REMOTE_ADDR)'ログイン情報を送信したユーザーのIPを取得します
Set ts=Conn_Net118.execute(* FROM のみログイン WHERE OLname='& userName & ' を選択)
if not ts.eof then ' データベースにクエリを実行して、このユーザーのログイン情報があるかどうかを確認します
OLtime=ts(OLtime)
OLip=ts(OLip)
if OLip1<>OLip および DateDiff(s,OLtime,now()) < maxTime then
'前の文は、送信されたログイン ユーザー IP がデータベースに最後に記録されたユーザー IP ではないかどうかを判断し、
' ユーザーの最終アクティビティ時刻と現在時刻の差が指定された秒数を超えない場合、ユーザーは現在オンラインであることが確認されます。
Response.Write <a href=javascript:history.go(-1)>このユーザーは現在オンラインです。他の場所からこのアカウントにログインすることはできません。 </a>
Response.End()
それ以外
'そうでない場合は、ログインが成功したと判断され、セッションに値が支払われます。
セッション(lgName)=ユーザー名
セッション(lgPass)=userPass
Response.リダイレクトログインOK.asp
応答.終了
終了する場合
それ以外
'データベースにログイン ユーザー レコードがない場合は、次のステートメントを実行します
薄暗い
ls=Server.CreateObject(ADODB.RECORDSET) を設定します。
ls.OpenSelect * ログインのみから、CONN_Net118,2,2
ls.ADDNEW
ls(OL名)=ユーザー名
ls(OLip)=OLip1
ls(OLtime)=NOW()
ls.UPDATE
ls.閉じる
ls=何も設定しない
'ログインの成功を判定し、セッションに価値を支払います
セッション(lgName)=ユーザー名
セッション(lgPass)=userPass
Response.リダイレクトログインOK.asp
応答.終了
終了する場合
エンドサブ%>
ASP ファイルを理解できれば、ログインに成功するとリーフが loginOK.asp にジャンプすることが一目でわかります。早速、このリーフのコードを見てみましょう。
<スタイルタイプ=テキスト/css>
<!--
ボディ {背景色: #FF9900;}
-->
</スタイル>
<% IF セッション(lgName)<> then %>
ログインに成功しました! ! !以下は、指定された時間に Web ページを更新し、オンラインであるかどうかをサーバーに報告するために、Web ページにこっそり組み込まれる iframe です。
区別しやすくするために、フレーム Web ページの背景色として白を使用します。
<iframe border=0 name=new_date marginwidth=0 Framespacing=0 marginheight=0 src=loginFrame.asp
Frameborder=0 noResize width=100 scrolling=no height=30 vspale=0></iframe>
<% その他 %>
ログインしていません。ウェブマスター情報ネットワークへようこそ: http://www.Net118.com
<% % の場合は終了>
注意深い人であれば、次に行う必要があるのはloginFrame.aspであることがすぐにわかるでしょう。
<!--#include file=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にして一般ユーザーには見えないようにするか、メインプログラムのWebページの背景色を同じにすることができます。ネストされた Web ページを定期的に更新すれば問題ありません。
少し前に、ディスカッション フォーラムで、セッションや Cookie などを使用して判断できると言っている人を見かけました。これは明らかに不可能です。なぜなら、オブジェクトが生成するオブジェクトは自分自身に対してのみ機能し、そのデータ コンテンツを他のユーザーと共有することはできないからです。すべてを共有しました。この目的を達成する別の方法としてアプリケーションを使用する必要がありますが、同時にログインするユーザーが多い場合、ユーザーごとに少なくとも 1 ~ 3 つのアプリケーション オブジェクトが生成されるだろうと考え、このアイデアを諦めました。貧弱なサーバー間違いなく引きずり込まれますよ~