En mi artículo anterior "Usar la caché para comprobar si los usuarios inician sesión repetidamente", después de practicar y pensar, descubrí que había pasado por alto un punto muy importante: solo establecer un valor de inicio de sesión en la caché al iniciar sesión. Si el tiempo de caducidad de la caché se establece durante mucho tiempo, una vez que el usuario cierre la sesión y vuelva a iniciarla dentro de un breve intervalo de tiempo, descubrirá que no puede iniciar sesión. Sin embargo, si el tiempo de caducidad se establece en poco tiempo, el inicio de sesión malicioso volverá a iniciar sesión en un período de tiempo más corto y pasará la prueba con éxito. Obviamente este método de juicio es imperfecto.
¿Cómo debemos mejorar este problema de tiempo? Establezca un intervalo de vencimiento corto y luego verifique la caché a intervalos regulares y vuelva a escribir la información de inicio de sesión del usuario en la caché. Entonces, siempre que el usuario no salga del sistema del sitio web ni cierre el navegador, ¡este método de evaluación siempre será efectivo! Entonces, en la WEB y en ASP.NET, ¿qué puede lograr convenientemente el efecto del temporizador? ¡Por ahora, la mejor opción es sin duda el control del Temporizador en ATLAS! Puede configurar el inicio del temporizador, el intervalo de tiempo y los eventos que se realizarán después del intervalo de tiempo.
Una vez mejorado el programa, se compartirá de la siguiente manera; consulte las notas del programa:
Página principal
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//ES " " http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<head runat="servidor">
<título>Página sin título</título>
</cabeza>
<cuerpo>
<formulario id="form1" runat="servidor">
<asp:ScriptManager ID="ScriptManager1" runat="servidor" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="servidor">
<Plantilla de contenido>
<asp:TextBox ID="TextBox1" runat="servidor"></asp:TextBox>
<asp:Botón ID="Botón1" runat="servidor" OnClick="Botón1_Click" Text="Iniciar sesión" />
<br />
<br />
<asp:Label ID="Label1" runat="servidor" Ancho="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Borrar caché" />
<asp:ID del temporizador="Timer1" runat="servidor" habilitado="False" Interval="15000" OnTick="Timer1_Tick">
</asp:temporizador>
</ContentTemplate>
</asp:Panel de actualización>
</div>
</formulario>
</cuerpo>
</html>
Programa en segundo plano
usando System;
usando System.Data;
usando System.Configuration;
usando System.Web;
utilizando System.Web.Security;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls
clase parcial pública _Default: System.Web.UI.Page
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
}
Botón vacío protegido1_Click (remitente del objeto, EventArgs e)
{
intentar
{
//nombre de usuario
string sName = TextBox1.Text
//Generar clave
cadena sKey = sName + "_Login";
//Obtener el valor de la clave dada en el caché
string sUser = Convert.ToString(Cache[sKey]
//Comprueba si existe
if (sUsuario == nulo || sUsuario == String.Empty)
{
Session["username"] = sName;
//No hay ningún elemento para esta clave en la caché, lo que indica que el usuario no ha iniciado sesión o que se ha agotado el tiempo de inicio de sesión.
// TimeSpan representa un intervalo de tiempo y obtiene el valor de configuración del sistema para el tiempo de espera de la sesión.
//(Si considera que el tiempo permitido para que los usuarios inicien sesión nuevamente es menor que el tiempo de espera de la sesión, este valor se puede establecer en un valor menor)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Para demostración aquí, el intervalo de guardado de caché se establece en 20 segundos.
TimeSpan SessTimeOut = nuevo TimeSpan(0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
llave,
llave,
nulo,
FechaHora.MaxValue,
tiempo de espera,
System.Web.Caching.CacheItemPriority.NotRemovable,
nulo
);
//Iniciar temporizador
this.Timer1.Enabled = true;
// Cuando inicias sesión por primera vez, puedes hacer el trabajo que deseas.
Label1.Text = "¡Hola!" + sNombre + "Bienvenido";
}
demás
{
// El registro del usuario se encuentra en la caché, lo que indica que ya inició sesión y tiene prohibido volver a iniciar sesión.
Label1.Text = "Lo sentimos, su identidad de usuario ha iniciado sesión";
devolver;
}
}
captura (System.Exception ex)
{
Etiqueta1.Texto = ex.Mensaje;
}
}
Botón vacío protegido2_Click (remitente del objeto, EventArgs e)
{
//nombre de usuario
cadena sName = TextBox1.Text
//Generar clave
string sKey = sName + "_Login"
// Para facilitar las pruebas, este método está configurado para eliminar la información de inicio de sesión de la caché.
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "¡La información de inicio de sesión del usuario se ha borrado de la caché!";
}
vacío protegido Timer1_Tick (remitente del objeto, EventArgs e)
{
if (Sesión["nombre de usuario"]! = nulo)
{
//nombre de usuario
cadena sName = TextBox1.Text
//Generar clave
string sKey = sName + "_Login"
//Obtiene el valor de la clave dada en la caché
cadena sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
si (sUsuario! = nulo)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
llave,
llave,
nulo,
FechaHora.MaxValue,
tiempo de espera,
System.Web.Caching.CacheItemPriority.NotRemovable,
nulo
);
}
demás
{
this.Timer1.Enabled = falso;
}
}
}
Código de muestra:/Files/heekui/WebLogin.rarPostscript
:
1 Este método es factible para juzgar los inicios de sesión repetidos de los usuarios, pero también conlleva otro problema. Si el temporizador está configurado para funcionar con regularidad, la sesión nunca caducará siempre que no salga normalmente o cierre el navegador. ¿Tendrá esto algún efecto negativo?
2 Este método enviará solicitudes al servidor con regularidad para cada usuario, lo que sin duda aumentará la carga del servidor. Si hay muchas personas en línea al mismo tiempo, ¿este tipo de solicitud tendrá un gran impacto en el servidor?
Por lo tanto, solo podemos decir que el método anterior es solo un método factible, pero no hay prueba de si es óptimo. No sé si tienes alguna manera mejor.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html