في مقالتي السابقة "استخدام ذاكرة التخزين المؤقت للتحقق مما إذا كان المستخدمون يقومون بتسجيل الدخول بشكل متكرر"، بعد التدريب والتفكير، وجدت أنني تجاهلت نقطة مهمة جدًا: فقط تعيين قيمة تسجيل الدخول إلى ذاكرة التخزين المؤقت عند تسجيل الدخول. إذا تم تعيين وقت انتهاء صلاحية ذاكرة التخزين المؤقت لفترة طويلة، فبمجرد قيام المستخدم بتسجيل الخروج وتسجيل الدخول مرة أخرى خلال فترة زمنية قصيرة، سيجد أنه لا يمكنه تسجيل الدخول. ومع ذلك، إذا تم تعيين وقت انتهاء الصلاحية على وقت قصير، فسيتم تسجيل الدخول الضار مرة أخرى خلال فترة زمنية أقصر واجتياز الاختبار بنجاح. من الواضح أن طريقة الحكم هذه غير كاملة.
كيف نحتاج إلى تحسين هذه المشكلة الوقت؟ قم بتعيين فاصل زمني قصير لانتهاء الصلاحية، ثم تحقق من ذاكرة التخزين المؤقت على فترات زمنية منتظمة وأعد كتابة معلومات تسجيل دخول المستخدم في ذاكرة التخزين المؤقت. لذا طالما أن المستخدم لم يخرج من نظام الموقع أو يغلق المتصفح، فإن طريقة الحكم هذه ستكون فعالة دائمًا! إذن، على الويب وتحت 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 ">
<رئيس التشغيل = "الخادم">
<title>صفحة بلا عنوان</title>
</الرأس>
<الجسم>
<معرف النموذج = "form1" runat = "الخادم">
<asp:ScriptManager ID = "ScriptManager1" runat = "الخادم" />
<ديف>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<قالب المحتوى>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID = "Button1" runat = "server" OnClick = "Button1_Click" Text = "تسجيل الدخول" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Width="350px"></asp:Label>
<asp:Button ID = "Button2" runat = "server" OnClick = "Button2_Click" Text = "مسح ذاكرة التخزين المؤقت" />
<asp:معرف المؤقت = "Timer1" runat = "server" Enabled = "False" Interval = "15000" OnTick = "Timer1_Tick">
</asp:المؤقت>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</النموذج>
</الجسم>
</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
{
Page_Load باطلة محمية (مرسل الكائن، EventArgs e)
{
}
باطلة محمية Button1_Click(مرسل الكائن، EventArgs e)
{
يحاول
{
//اسم المستخدم
string sName = TextBox1.Text;
//إنشاء مفتاح
string sKey = sName + "_Login";
// احصل على قيمة المفتاح المحدد في ذاكرة التخزين المؤقت
string sUser = Convert.ToString(Cache[sKey]);
//تحقق من وجوده
إذا (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
// لا يوجد عنصر لهذا المفتاح في ذاكرة التخزين المؤقت، مما يشير إلى أن المستخدم لم يقوم بتسجيل الدخول، أو أن مهلة تسجيل الدخول قد انتهت.
// يمثل TimeSpan فاصلًا زمنيًا ويحصل على قيمة إعداد النظام لمهلة الجلسة.
//(إذا كنت ترى أن الوقت المسموح به للمستخدمين لتسجيل الدخول مرة أخرى أقل من مهلة الجلسة، فيمكن تعيين هذه القيمة أصغر)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
// للتوضيح هنا، تم ضبط الفاصل الزمني لحفظ ذاكرة التخزين المؤقت على 20 ثانية.
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
مفتاح,
مفتاح,
باطل،
التاريخ والوقت.القيمة القصوى،
سيسيتايم أوت,
System.Web.Caching.CacheItemPriority.NotRemovable،
باطل
);
//بدء الموقت
this.Timer1.Enabled = true;
// عند تسجيل الدخول لأول مرة، يمكنك القيام بالعمل الذي تريد القيام به.
Label1.Text = "مرحبًا!" + sName + "مرحبًا"؛
}
آخر
{
// تم العثور على سجل المستخدم في ذاكرة التخزين المؤقت، مما يشير إلى أنه قد قام بتسجيل الدخول بالفعل ويحظر عليه تسجيل الدخول مرة أخرى.
Label1.Text = "عذرًا، تم تسجيل دخول هوية المستخدم الخاصة بك";
يعود؛
}
}
قبض (System.Exception على سبيل المثال)
{
Label1.Text = ex.Message;
}
}
باطلة محمية Button2_Click (مرسل الكائن، EventArgs e)
{
//اسم المستخدم
string sName = TextBox1.Text;
//إنشاء مفتاح
string sKey = sName + "_Login";
// لتسهيل الاختبار، تم إعداد هذه الطريقة لإزالة معلومات تسجيل الدخول من ذاكرة التخزين المؤقت
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "تم مسح معلومات تسجيل دخول المستخدم من ذاكرة التخزين المؤقت!";
}
Timer1_Tick (مرسل الكائن، EventArgs e) محمي باطل
{
إذا (جلسة ["اسم المستخدم"] != فارغة)
{
//اسم المستخدم
string sName = TextBox1.Text;
//إنشاء مفتاح
string sKey = sName + "_Login";
// احصل على قيمة المفتاح المحدد في ذاكرة التخزين المؤقت
string sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
إذا (sUser != فارغة)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
مفتاح,
مفتاح,
باطل،
التاريخ والوقت.القيمة القصوى،
سيسيتايم أوت,
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