In meinem vorherigen Artikel „Mit dem Cache prüfen, ob sich Benutzer wiederholt anmelden“ habe ich nach Übung und Nachdenken festgestellt, dass ich einen sehr wichtigen Punkt übersehen habe: Beim Anmelden nur einen Anmeldewert für den Cache festlegen. Wenn die Cache-Ablaufzeit auf einen langen Zeitraum eingestellt ist, stellt der Benutzer nach dem Abmelden und erneuten Anmelden innerhalb eines kurzen Zeitintervalls fest, dass er sich nicht anmelden kann. Wenn die Ablaufzeit jedoch auf eine kurze Zeit eingestellt ist, meldet sich der böswillige Login in kürzerer Zeit erneut an und besteht den Test erfolgreich. Offensichtlich ist diese Beurteilungsmethode unvollkommen.
Wie müssen wir dieses Zeitproblem verbessern? Legen Sie ein kurzes Ablaufintervall fest, überprüfen Sie dann in regelmäßigen Abständen den Cache und schreiben Sie die Benutzeranmeldeinformationen neu in den Cache. Solange der Benutzer das Website-System nicht verlässt oder den Browser schließt, ist diese Beurteilungsmethode immer wirksam! Was kann also im WEB und unter ASP.NET bequem den Timer-Effekt erzielen? Die beste Wahl ist derzeit zweifellos die Timer-Steuerung in ATLAS! Sie können den Start des Timers, die Intervallzeit und die nach der Intervallzeit auszuführenden Ereignisse festlegen.
Nachdem das Programm verbessert wurde, wird es wie folgt weitergegeben. Bitte beachten Sie die Programmhinweise:
Startseite
<%@ 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="server">
<title>Unbenannte Seite</title>
</head>
<Körper>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<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" Breite="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Cache leeren" />
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:Timer>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Hintergrundprogramm
mit System;
Verwenden von System.Data;
Verwenden von System.Configuration;
mit System.Web;
mit System.Web.Security;
mit System.Web.UI;
mit System.Web.UI.WebControls;
mit System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
öffentliche Teilklasse _Default: System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
versuchen
{
//Benutzername
string sName = TextBox1.Text;
//Schlüssel generieren
string sKey = sName + "_Login";
//Den Wert des angegebenen Schlüssels im Cache abrufen
string sUser = Convert.ToString(Cache[sKey]);
//Überprüfen Sie, ob es existiert
if (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
//Es gibt kein Element für diesen Schlüssel im Cache, was darauf hinweist, dass der Benutzer nicht angemeldet ist oder die Anmeldung abgelaufen ist.
//TimeSpan stellt ein Zeitintervall dar und ruft den Systemeinstellungswert für das Sitzungszeitlimit ab.
//(Wenn Sie bedenken, dass die Zeit, die Benutzern für die erneute Anmeldung zur Verfügung steht, kürzer ist als das Sitzungs-Timeout, kann dieser Wert kleiner eingestellt werden.)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Zur Demonstration hier: Das Cache-Speicherintervall ist auf 20 Sekunden eingestellt.
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
sKey,
sKey,
null,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
null
);
//Timer starten
this.Timer1.Enabled = true;
//Wenn Sie sich zum ersten Mal anmelden, können Sie die Arbeit erledigen, die Sie erledigen möchten.
Label1.Text = „Hallo!“ + sName + „Willkommen“;
}
anders
{
// Der Datensatz des Benutzers wird im Cache gefunden, was darauf hinweist, dass er sich bereits angemeldet hat und sich nicht erneut anmelden darf.
Label1.Text = „Ihre Benutzeridentität wurde leider angemeldet“;
zurückkehren;
}
}
Catch (System.Exception ex)
{
Label1.Text = ex.Message;
}
}
protected void Button2_Click(object sender, EventArgs e)
{
//Benutzername
string sName = TextBox1.Text;
//Schlüssel generieren
string sKey = sName + "_Login";
//Zur Vereinfachung des Testens ist diese Methode so eingerichtet, dass Anmeldeinformationen aus dem Cache entfernt werden
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "Die Benutzeranmeldeinformationen wurden aus dem Cache gelöscht!";
}
protected void Timer1_Tick(object sender, EventArgs e)
{
if (Session["Benutzername"] != null)
{
//Benutzername
string sName = TextBox1.Text;
//Schlüssel generieren
string sKey = sName + "_Login";
//Den Wert des angegebenen Schlüssels im Cache abrufen
string 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(
sKey,
sKey,
null,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
null
);
}
anders
{
this.Timer1.Enabled = false;
}
}
}
Beispielcode:/Files/heekui/WebLogin.rarPostscript
:
1 Diese Methode ist für die Beurteilung wiederholter Benutzeranmeldungen geeignet, bringt aber auch ein weiteres Problem mit sich. Wenn der Timer so eingestellt ist, dass er regelmäßig funktioniert, läuft die Sitzung nie ab, solange sie nicht normal beendet oder der Browser geschlossen wird. Wird dies irgendwelche negativen Auswirkungen haben?
2 Bei dieser Methode werden für jeden Benutzer regelmäßig Anfragen an den Server gesendet, was zweifellos die Belastung des Servers erhöht. Wenn viele Leute gleichzeitig online sind, hat diese Art von Anfrage große Auswirkungen auf den Server?
Daher können wir nur sagen, dass die obige Methode nur eine praktikable Methode ist, es gibt jedoch keinen Test, ob sie optimal ist. Ich weiß nicht, ob Sie einen besseren Weg haben.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html