Dans mon article précédent "Utiliser le cache pour vérifier si les utilisateurs se connectent à plusieurs reprises", après pratique et réflexion, j'ai découvert que j'avais négligé un point très important : définir une valeur de connexion au cache uniquement lors de la connexion. Si le délai d'expiration du cache est défini sur une longue période, une fois que l'utilisateur se déconnecte et se reconnecte dans un court intervalle de temps, il constatera qu'il ne peut pas se connecter. Cependant, si le délai d'expiration est court, la connexion malveillante se reconnectera dans un délai plus court et réussira le test. Il est évident que cette méthode de jugement est imparfaite.
Comment devons-nous améliorer ce problème de temps ? Définissez un court intervalle d'expiration, puis vérifiez le cache à intervalles réguliers et réécrivez les informations de connexion de l'utilisateur dans le cache. Ainsi, tant que l’utilisateur ne quitte pas le système du site Web ou ne ferme pas le navigateur, cette méthode de jugement sera toujours efficace ! Alors, sur le WEB et sous ASP.NET, qu'est-ce qui peut facilement obtenir l'effet timer ? Pour l’instant, le meilleur choix est sans aucun doute le contrôle Timer d’ATLAS ! Vous pouvez définir le début du minuteur, le temps d'intervalle et les événements à effectuer après le temps d'intervalle.
Une fois le programme amélioré, il sera partagé comme suit, veuillez vous référer aux notes du programme :
Première page
<%@ 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="serveur">
<title>Page sans titre</title>
</tête>
<corps>
<form id="form1" runat="serveur">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Modèle de contenu>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Connexion" />
<br />
<br />
<asp:Label ID="Label1" runat="server" width="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Vider le cache" />
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:Minuterie>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</corps>
</html>
Programme en arrière-plan
utilisant System ;
en utilisant System.Data ;
en utilisant System.Configuration ;
en utilisant System.Web ;
en utilisant System.Web.Security ;
en utilisant System.Web.UI ;
en utilisant System.Web.UI.WebControls ;
en utilisant System.Web.UI.WebControls.WebParts ;
en utilisant System.Web.UI.HtmlControls ;
classe partielle publique _Default : System.Web.UI.Page
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
}
protected void Button1_Click (expéditeur de l'objet, EventArgs e)
{
essayer
{
//nom d'utilisateur
string sName = TextBox1.Text;
//Générer la clé
chaîne sKey = sName + "_Login" ;
//Obtenir la valeur de la clé donnée dans le cache
string sUser = Convert.ToString(Cache[sKey]);
//Vérifie s'il existe
if (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
//Il n'y a aucun élément pour cette clé dans le cache, ce qui indique que l'utilisateur n'est pas connecté ou que la connexion a expiré.
//TimeSpan représente un intervalle de temps et obtient la valeur de paramètre du système pour le délai d'expiration de la session.
//(Si vous considérez que le temps imparti aux utilisateurs pour se reconnecter est inférieur au délai d'expiration de la session, cette valeur peut être définie plus petite)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Pour démonstration ici, l'intervalle de sauvegarde du cache est défini sur 20 secondes.
TimeSpan SessTimeOut = nouveau TimeSpan (0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
sClé,
sClé,
nul,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
nul
);
//Démarrer la minuterie
this.Timer1.Enabled = true;
//Lorsque vous vous connectez pour la première fois, vous pouvez effectuer le travail que vous souhaitez effectuer.
Label1.Text = "Bonjour !" + sName + "Bienvenue" ;
}
autre
{
//L'enregistrement de l'utilisateur est retrouvé dans le Cache, indiquant qu'il s'est déjà connecté et qu'il lui est interdit de se reconnecter.
Label1.Text = "Désolé, votre identité d'utilisateur a été connectée";
retour;
}
}
catch (System.Exception ex)
{
Label1.Text = ex.Message ;
}
}
protected void Button2_Click (expéditeur de l'objet, EventArgs e)
{
//nom d'utilisateur
string sName = TextBox1.Text;
//Générer une clé
string sKey = sName + "_Login" ;
//Pour faciliter les tests, cette méthode est configurée pour supprimer les informations de connexion du cache.
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "Les informations de connexion de l'utilisateur ont été effacées du cache !";
}
protected void Timer1_Tick (expéditeur de l'objet, EventArgs e)
{
if (Session["nom d'utilisateur"] != null)
{
//nom d'utilisateur
string sName = TextBox1.Text;
//Générer une clé
string sKey = sName + "_Login" ;
//Récupère la valeur de la clé donnée dans le cache
chaîne sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
si (sUtilisateur != null)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
sClé,
sClé,
nul,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
nul
);
}
autre
{
this.Timer1.Enabled = faux ;
}
}
}
Exemple de code :/Files/heekui/WebLogin.rarPostscript
:
1 Cette méthode est réalisable pour évaluer les connexions répétées des utilisateurs, mais elle s'accompagne également d'un autre problème. Si la minuterie est configurée pour fonctionner régulièrement, la session n'expirera jamais tant qu'elle ne se terminera pas normalement ou ne fermera pas le navigateur. Est-ce que cela aura des effets négatifs ?
2 Cette méthode enverra régulièrement des requêtes au serveur pour chaque utilisateur, ce qui augmentera sans aucun doute la charge du serveur. S’il y a beaucoup de personnes en ligne en même temps, ce genre de requête aura-t-il un gros impact sur le serveur ?
Par conséquent, nous pouvons seulement dire que la méthode ci-dessus n’est qu’une méthode réalisable, mais il n’existe aucun test pour savoir si elle est optimale. Je ne sais pas si vous avez un meilleur moyen.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html