ในบทความก่อนหน้าของฉัน "การใช้แคชเพื่อตรวจสอบว่าผู้ใช้เข้าสู่ระบบซ้ำแล้วซ้ำอีก" หลังจากฝึกฝนและคิดแล้ว ฉันพบว่าฉันมองข้ามจุดที่สำคัญมาก นั่นคือการตั้งค่าการเข้าสู่ระบบเป็นแคชเท่านั้นเมื่อเข้าสู่ระบบ หากตั้งเวลาหมดอายุของแคชไว้เป็นเวลานาน เมื่อผู้ใช้ออกจากระบบและเข้าสู่ระบบอีกครั้งภายในช่วงเวลาสั้นๆ จะพบว่าไม่สามารถเข้าสู่ระบบได้ อย่างไรก็ตาม หากตั้งเวลาหมดอายุเป็นเวลาสั้นๆ การเข้าสู่ระบบที่เป็นอันตรายจะเข้าสู่ระบบอีกครั้งในช่วงเวลาที่สั้นลงและผ่านการทดสอบได้สำเร็จ แน่นอนว่าวิธีการตัดสินแบบนี้ไม่สมบูรณ์
เราต้องปรับปรุงปัญหาครั้งนี้อย่างไร? กำหนดช่วงเวลาหมดอายุสั้นๆ จากนั้นตรวจสอบแคชตามช่วงเวลาปกติ และเขียนข้อมูลการเข้าสู่ระบบของผู้ใช้ใหม่ลงในแคช ดังนั้นตราบใดที่ผู้ใช้ไม่ออกจากระบบเว็บไซต์หรือปิดเบราว์เซอร์ วิธีการตัดสินนี้จะมีผลเสมอ! ดังนั้นบนเว็บและภายใต้ 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 ">
<หัว runat="เซิร์ฟเวอร์">
<title>หน้าที่ไม่มีชื่อ</title>
</หัว>
<ร่างกาย>
<form id="form1" runat="server">
<asp:ScriptManager ID = "ScriptManager1" runat = "เซิร์ฟเวอร์" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="เซิร์ฟเวอร์">
<เทมเพลตเนื้อหา>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID = "Button1" runat = "เซิร์ฟเวอร์" 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:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:ตัวจับเวลา>
</เทมเพลตเนื้อหา>
</asp:UpdatePanel>
</div>
</แบบฟอร์ม>
</ร่างกาย>
</html>
โปรแกรมพื้นหลัง
ที่ใช้ระบบ;
ใช้ System.Data;
โดยใช้ระบบการกำหนดค่า;
ใช้ 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;
// สร้างคีย์
สตริง sKey = sName + "_Login";
//รับค่าของคีย์ที่กำหนดในแคช
string sUser = Convert.ToString(Cache[sKey]);
//ตรวจสอบว่ามีอยู่หรือไม่
ถ้า (sUser == null || sUser == String.Empty)
-
Session["username"] = sName;
//ไม่มีรายการสำหรับคีย์นี้ในแคช ซึ่งบ่งชี้ว่าผู้ใช้ไม่ได้เข้าสู่ระบบ หรือการเข้าสู่ระบบหมดเวลา
//TimeSpan แสดงถึงช่วงเวลาและรับค่าการตั้งค่าของระบบสำหรับการหมดเวลาเซสชัน
//(หากคุณพิจารณาว่าเวลาที่อนุญาตให้ผู้ใช้เข้าสู่ระบบอีกครั้งนั้นน้อยกว่าการหมดเวลาของเซสชัน คุณสามารถตั้งค่านี้ให้น้อยลงได้)
//TimeSpan SessTimeOut = TimeSpan ใหม่ (0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//สำหรับการสาธิตที่นี่ ช่วงเวลาการบันทึกแคชถูกตั้งไว้ที่ 20 วินาที
ช่วงเวลา SessTimeOut = ช่วงเวลาใหม่ (0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
คีย์,
คีย์,
โมฆะ,
DateTime.MaxValue,
เซสไทม์เอาท์,
System.Web.Caching.CacheItemPriority.NotRemovable,
โมฆะ
-
//เริ่มจับเวลา
this.Timer1.Enabled = true;
//เมื่อคุณเข้าสู่ระบบเป็นครั้งแรก คุณสามารถทำงานที่ต้องการได้
Label1.Text = "สวัสดี!" + sName + "ยินดีต้อนรับ";
-
อื่น
-
//พบบันทึกของผู้ใช้ในแคช ซึ่งระบุว่าเขาได้เข้าสู่ระบบแล้วและถูกห้ามไม่ให้เข้าสู่ระบบอีกครั้ง
Label1.Text = "ขออภัย ข้อมูลประจำตัวผู้ใช้ของคุณได้ถูกล็อกอินแล้ว";
กลับ;
-
-
จับ (System.Exception เช่น)
-
Label1.Text = เช่นข้อความ;
-
-
โมฆะที่ได้รับการป้องกัน 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)
-
ถ้า (เซสชัน ["ชื่อผู้ใช้"] != null)
-
//ชื่อผู้ใช้
string sName = TextBox1.Text;
// สร้างคีย์
string sKey = sName + "_Login";
// รับค่าของคีย์ที่กำหนดในแคช
string sUser = Convert.ToString (แคช [sKey]);
TimeSpan SessTimeOut = TimeSpan ใหม่ (0, 0, 0, 20, 0);
ถ้า (sUser != null)
-
HttpContext.Current.Cache.Remove (sKey);
-
HttpContext.Current.Cache.Insert(
คีย์,
คีย์,
โมฆะ,
DateTime.MaxValue,
เซสไทม์เอาท์,
System.Web.Caching.CacheItemPriority.NotRemovable,
โมฆะ
-
-
อื่น
-
this.Timer1.Enabled = เท็จ;
-
-
-
โค้ดตัวอย่าง:/Files/heekui/WebLogin.rarPostscript
:
1 วิธีการนี้เป็นไปได้สำหรับการตัดสินการเข้าสู่ระบบซ้ำโดยผู้ใช้ แต่ก็มีปัญหาอื่นตามมาด้วย หากตั้งเวลาให้ทำงานเป็นประจำ เซสชันจะไม่มีวันหมดอายุตราบใดที่ไม่ได้ออกตามปกติหรือปิดเบราว์เซอร์ สิ่งนี้จะมีผลเสียหรือไม่?
2 วิธีการนี้จะส่งคำขอไปยังเซิร์ฟเวอร์เป็นประจำสำหรับผู้ใช้แต่ละราย ซึ่งจะเพิ่มภาระบนเซิร์ฟเวอร์อย่างไม่ต้องสงสัย หากมีผู้คนออนไลน์พร้อมกันจำนวนมาก คำขอประเภทนี้จะมีผลกระทบอย่างมากต่อเซิร์ฟเวอร์หรือไม่
ดังนั้นเราจึงบอกได้เพียงว่าวิธีการข้างต้นเป็นเพียงวิธีที่เป็นไปได้ แต่ไม่มีการทดสอบว่าเหมาะสมที่สุดหรือไม่ ฉันไม่รู้ว่าคุณมีวิธีที่ดีกว่านี้ไหม
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html