前回の記事「キャッシュを使用してユーザーが繰り返しログインしていないか確認する」では、実践して考えた結果、ログイン値をキャッシュに設定するのはログイン時のみであるという非常に重要な点を見落としていたことがわかりました。キャッシュの有効期限が長く設定されている場合、ユーザーが一度ログアウトし、短い間隔で再度ログインすると、ログインできなくなります。ただし、有効期限が短く設定されている場合、悪意のあるログインはより短い時間で再度ログインし、テストに合格します。明らかに、この判断方法は不完全です。
この時間の問題をどう改善する必要があるでしょうか?有効期限を短く設定し、定期的にキャッシュを確認し、ユーザーのログイン情報をキャッシュに書き換えます。したがって、ユーザーが Web サイトのシステムを終了したり、ブラウザを閉じたりしない限り、この判断方法は常に有効です。では、WEB および ASP.NET では、タイマー効果を便利に実現できるものは何でしょうか?現時点では、間違いなく ATLAS のタイマー コントロールが最良の選択です。タイマーの開始時間、インターバル時間、インターバル時間後に実行するイベントを設定できます。
プログラムが改善された後、次のように共有されます。プログラムノートを参照してください。
フロント ページ
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN " " http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<head runat="サーバー">
<title>無題のページ</title>
</head>
<本文>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="サーバー" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<コンテンツテンプレート>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Login" />
<br />
<br />
<asp:Label ID="Label1" runat="server" width="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Clear Cache" />
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:タイマー>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
システムを使用した
バックグラウンド プログラム
。
System.Data を使用します。
System.Configuration を使用します。
System.Web を使用します。
System.Web.Security を使用します。
System.Web.UI を使用します。
System.Web.UI.WebControls を使用します。
System.Web.UI.WebControls.WebParts を使用します。
System.Web.UI.HtmlControls を使用して
パブリック部分クラス _Default : System.Web.UI.Page
{
protected void Page_Load(オブジェクト送信者, EventArgs e)
{
}
protected void Button1_Click(オブジェクト送信者、EventArgs e)
{
試す
{
//ユーザー名
string sName = TextBox1.Text;
//キーを生成します。
文字列 sKey = sName + "_Login";
// キャッシュ内の指定されたキーの値を取得します
string sUser = Convert.ToString(Cache[sKey]);
// 存在するかどうかを確認します。
if (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
//キャッシュ内にこのキーの項目がありません。これは、ユーザーがログインしていないか、ログインがタイムアウトしたことを示しています。
//TimeSpan は時間間隔を表し、セッション タイムアウトのシステム設定値を取得します。
//(ユーザーが再ログインできる時間がセッションタイムアウトよりも短いことを考慮すると、この値を小さく設定できます)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//ここではデモンストレーションのために、キャッシュ保存間隔を 20 秒に設定します。
タイムスパン SessTimeOut = 新しいタイムスパン(0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
sキー、
sキー、
ヌル、
DateTime.MaxValue、
セスタイムアウト、
System.Web.Caching.CacheItemPriority.NotRemovable、
ヌル
);
//タイマーを開始します
this.Timer1.Enabled = true;
//初めてログインすると、必要な作業を実行できます。
Label1.Text = "こんにちは!" + sName + "ようこそ";
}
それ以外
{
// ユーザーのレコードがキャッシュ内に見つかり、ユーザーがすでにログインしており、再ログインが禁止されていることを示します。
Label1.Text = "申し訳ありませんが、あなたのユーザー ID はログインしています";
戻る;
}
}
catch (System.Exception ex)
{
Label1.Text = ex.Message;
}
}
protected void Button2_Click(オブジェクト送信者、EventArgs e)
{
//ユーザー名
string sName = TextBox1.Text;
//キーを生成します。
string sKey = sName + "_Login";
//テストの便宜上、このメソッドはキャッシュからログイン情報を削除するように設定されています。
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "ユーザーのログイン情報がキャッシュから消去されました!";
}
protected void Timer1_Tick(オブジェクト送信者、EventArgs e)
{
if (セッション["ユーザー名"] != null)
{
//ユーザー名
string sName = TextBox1.Text;
//キーを生成します。
string sKey = sName + "_Login";
//キャッシュ内の指定されたキーの値を取得します。
文字列 sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
if (sUser != null)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
sキー、
sキー、
ヌル、
DateTime.MaxValue、
セスタイムアウト、
System.Web.Caching.CacheItemPriority.NotRemovable、
ヌル
);
}
それ以外
{
this.Timer1.Enabled = false;
}
}
}
サンプルコード:/Files/heekui/WebLogin.rarPostscript
:
1 この方法は、ユーザの繰り返しログインを判定する場合には有効ですが、別の問題も伴います。タイマーが定期的に動作するように設定されている場合、セッションが正常に終了するかブラウザを閉じない限り、セッションは期限切れになりません。これは何か悪影響を及ぼしますか?
2 この方法では、ユーザーごとに定期的にサーバーにリクエストが送信されるため、サーバーの負荷が確実に増加します。同時に多くの人がオンラインに接続している場合、この種のリクエストはサーバーに大きな影響を与えますか?
したがって、上記の方法は実現可能な方法であるとしか言えませんが、それが最適であるかどうかをテストすることはできません。もっと良い方法があるかどうかはわかりません。
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html