ASP.NETはWEB運用においてユーザの複数回のログインを防止する

3580 ワード

Web開発では、同じユーザが同じ時間に1回しかログインできないことを要求するシステムがあります.つまり、1人のユーザがログインしている場合、終了する前に再ログインするとエラーを報告する必要があります.
一般的な処理方法は、ユーザーがログインしたときに、そのユーザーがすでにアプリケーションに存在するかどうかを判断し、存在する場合はエラーを報告し、存在しない場合はアプリケーションに追加することです(アプリケーションはすべてのセッションで共有され、webアプリケーション全体で唯一のオブジェクトです):
string strUserId = txtUser.Text;

 

ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;

if (list == null)

list = new ArrayList();

for (int i = 0; i < list.Count; i++)

{

if (strUserId == (list[i] as string))

{

// ,

lblError.Text = " ";

return;

}

}

list.Add(strUserId);

Application.Add("GLOBAL_USER_LIST", list); Cache 。


 
次に、ユーザが終了したときにこのユーザをApplicationから除去する、Global.asaxのSession_Endイベントでの処理:
void Session_End(object sender, EventArgs e)
{

 

// 。

// : Web.config sessionstate

// InProc , Session_End 。 StateServer

// SQLServer, 。

string strUserId = Session["SESSION_USER"] as string;

ArrayList list = Application.Get("GLOBAL_USER_LIST") as ArrayList;

if (strUserId != null && list != null)
{

list.Remove(strUserId);

Application.Add("GLOBAL_USER_LIST", list);

}


 
これらは問題ありません.問題は、ユーザーがブラウザの右上隅の閉じるボタンを直接クリックしたときに問題があることです.直接閉じると、すぐにセッションの有効期限が切れるイベントがトリガーされるわけではないので、ブラウザを閉じてからログインしてもログインできません.
ここには2つの処理方法があります.
1、Java Script方式を使う
各ページにjavascriptコードを追加します.
function window.onbeforeunload() {
if (event.clientX > document.body.clientWidth &&event.clientY < 0 || event.altKey) {
window.open("logout.ASPx");
}
}     

onbeforeunloadメソッドはブラウザのシャットダウン、リフレッシュ、ページ転送などの場合に実行されるため、シャットダウンボタンをクリックした場合やAlt+F 4を押した場合に本格的なシャットダウン操作が実行されると判断する必要がある.
そしてaspxのPage_Loadに書き込みとSession_Endと同じ方法で、同時にlogout.aspxにイベントを追加する:onload=“javascript:window.close()”
しかし、javascriptはブラウザによって異なる動作をする可能性があります.また、ファイル->閉じることで判断されません.
2、xmlhttpメソッドを使用する(この方法はテストで問題ない)
各ページに次のjavascriptを入れます(これらのjavascriptは共通に書くこともできますし、各ページに導入すればいいです)
var x = 0;
function myRefresh() {
var httpRequest = new ActiveXObject("microsoft.xmlhttp");
httpRequest.open("GET", "test.aspx", false);
httpRequest.send(null);
x++;
if (x < 60) //60 , Session 30
{
setTimeout("myRefresh()", 30 * 1000); //30
}
}
myRefresh(); web.config :

 

<sessionState mode="InProc" timeout="1"></sessionState>test.aspx

, Page_Load :Response.Expires = -1;


キャッシュを使用しないで、毎回このページに呼び出されることを保証します.
セシオンの有効期限を1分に設定し、各ページに30秒ごとにテストページを接続します.
セッションを有効に維持し、合計60回、つまり30分です.30分後にユーザーがまだ操作していない場合、Sessionは期限切れになります.もちろん、ユーザーがブラウザを直接閉じると、1分後にSessionも期限切れになります.これで要求を満たすことができます.