이전 기사 "캐시를 사용하여 사용자의 반복 로그인 여부 확인"에서 연습하고 생각해 본 결과 로그인 시 로그인 값만 캐시에 설정한다는 매우 중요한 점을 간과했다는 사실을 발견했습니다. 캐시 만료 시간을 길게 설정한 경우 사용자가 로그아웃한 후 짧은 시간 내에 다시 로그인하면 로그인할 수 없는 현상이 발생합니다. 그러나 만료 시간을 짧게 설정하면 악성 로그인은 더 짧은 시간 내에 다시 로그인하여 테스트를 성공적으로 통과하게 됩니다. 분명히 이 판단 방법은 불완전합니다.
이 시간 문제를 어떻게 개선해야 합니까? 짧은 만료 간격을 설정한 후 정기적으로 Cache를 확인하고 사용자 로그인 정보를 Cache에 다시 씁니다. 따라서 사용자가 웹사이트 시스템을 종료하거나 브라우저를 닫지 않는 한 이 판단 방법은 항상 유효합니다! 그렇다면 웹과 ASP.NET에서 타이머 효과를 편리하게 얻을 수 있는 방법은 무엇일까요? 현재로서는 최선의 선택은 의심할 여지 없이 ATLAS의 타이머 컨트롤입니다! 타이머 시작, 간격 시간, 간격 시간 이후에 수행할 이벤트를 설정할 수 있습니다.
프로그램이 개선된 후 다음과 같이 공유할 예정이니, 프로그램 노트를 참고해주세요.
첫 페이지
<%@ 페이지 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="서버">
<title>제목 없는 페이지</title>
</head>
<본문>
<form id="form1" runat="서버">
<asp:ScriptManager ID="ScriptManager1" runat="서버" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="서버">
<컨텐츠템플릿>
<asp:TextBox ID="TextBox1" runat="서버"></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:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:타이머>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</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
{
protected void Page_Load(개체 전송자, EventArgs e)
{
}
protected void Button1_Click(객체 전송자, EventArgs e)
{
노력하다
{
//사용자 이름
string sName = TextBox1.Text;
//키 생성;
문자열 sKey = sName + "_Login";
//캐시에서 주어진 키의 값을 가져옵니다.
string sUser = Convert.ToString(Cache[sKey]);
//존재하는지 확인
if (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.삽입(
에스키,
에스키,
널,
날짜시간.최대값,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
null
);
//타이머 시작
this.Timer1.Enabled = true;
//처음 로그인하면 하고 싶은 작업을 할 수 있습니다.
Label1.Text = "안녕하세요!" + sName + "환영합니다";
}
또 다른
{
//사용자의 기록이 캐시에서 발견되어 해당 사용자가 이미 로그인했으며 다시 로그인할 수 없음을 나타냅니다.
Label1.Text = "죄송합니다. 귀하의 사용자 ID는 로그인되어 있습니다.";
반품;
}
}
잡기 (System.Exception ex)
{
Label1.Text = ex.메시지;
}
}
protected void Button2_Click(객체 전송자, EventArgs e)
{
//사용자 이름
string sName = TextBox1.Text;
//키 생성;
string sKey = sName + "_Login";
//테스트의 편의를 위해 이 메소드는 캐시에서 로그인 정보를 제거하도록 설정됩니다.
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "사용자 로그인 정보가 캐시에서 지워졌습니다!";
}
protected void Timer1_Tick(객체 전송자, EventArgs e)
{
if (세션["사용자 이름"] != null)
{
//사용자 이름
string sName = TextBox1.Text;
//키 생성;
string sKey = sName + "_Login";
//캐시에서 주어진 키 값을 가져옵니다.
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.삽입(
에스키,
에스키,
널,
날짜시간.최대값,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
null
);
}
또 다른
{
this.Timer1.Enabled = 거짓;
}
}
}
샘플 코드:/Files/heekui/WebLogin.rarPostscript
:
1 이 방법은 사용자의 반복 로그인 여부를 판단하는 데에는 적합하지만, 또 다른 문제를 동반합니다. 타이머가 정기적으로 작동하도록 설정된 경우 세션이 정상적으로 종료되거나 브라우저를 닫지 않는 한 세션은 만료되지 않습니다. 이것이 부정적인 영향을 미칠까요?
2 이 방법은 각 사용자에 대해 정기적으로 서버에 요청을 보내므로 의심할 여지 없이 서버의 부담이 증가합니다. 동시에 온라인에 많은 사람이 있다면 이런 요청이 서버에 큰 영향을 미칠까요?
따라서 위의 방법은 실현 가능한 방법일 뿐 최적인지 여부에 대한 테스트는 없다고 말할 수 있습니다. 더 좋은 방법이 있는지 모르겠습니다.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html