Dalam artikel saya sebelumnya "Menggunakan Cache untuk Memeriksa apakah Pengguna Login Berulang Kali", setelah berlatih dan berpikir, saya menemukan bahwa saya mengabaikan poin yang sangat penting: hanya menyetel nilai login ke Cache saat login. Jika waktu kedaluwarsa Cache diatur untuk waktu yang lama, setelah pengguna keluar dan masuk lagi dalam interval waktu yang singkat, mereka akan mendapati bahwa mereka tidak dapat masuk. Namun, jika waktu kedaluwarsa diatur ke waktu yang singkat, login berbahaya akan login lagi dalam jangka waktu yang lebih singkat dan berhasil lulus ujian. Jelas sekali metode penilaian ini tidak sempurna.
Bagaimana kita perlu memperbaiki masalah waktu ini? Tetapkan interval kedaluwarsa yang singkat, lalu periksa Cache secara berkala dan tulis ulang informasi login pengguna ke dalam Cache. Jadi selama pengguna tidak keluar dari sistem website atau menutup browser, metode penilaian ini akan selalu efektif! Jadi, di WEB dan di bawah ASP.NET, apa yang dapat dengan mudah mencapai efek pengatur waktu? Untuk saat ini, pilihan terbaik tidak diragukan lagi adalah kontrol Timer di ATLAS! Anda dapat mengatur permulaan pengatur waktu, waktu interval, dan acara yang akan dilakukan setelah waktu interval.
Setelah program diperbaiki akan dibagikan sebagai berikut, silakan lihat catatan program:
Halaman depan
<%@ Halaman 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>Halaman Tanpa Judul</title>
</kepala>
<tubuh>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Templat Konten>
<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" Lebar="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Hapus Cache" />
<asp:Timer ID="Timer1" runat="server" Diaktifkan="False" Interval="15000" OnTick="Timer1_Tick">
</asp:Pengatur waktu>
</Templat Konten>
</asp:Panel Pembaruan>
</div>
</bentuk>
</tubuh>
</html>
Program latar belakang
menggunakan Sistem;
menggunakan Sistem.Data;
menggunakan Sistem.Konfigurasi;
menggunakan Sistem.Web;
menggunakan Sistem.Web.Keamanan;
menggunakan Sistem.Web.UI;
menggunakan Sistem.Web.UI.WebControls;
menggunakan System.Web.UI.WebControls.WebParts;
menggunakan System.Web.UI.HtmlControls;
kelas parsial publik _Default : System.Web.UI.Page
{
dilindungi kekosongan Page_Load (pengirim objek, EventArgs e)
{
}
void yang dilindungi Button1_Click(pengirim objek, EventArgs e)
{
mencoba
{
//nama belakang
string sName = TextBox1.Text;
//Buat Kunci
string sKey = sNama + "_Login";
//Dapatkan nilai Kunci yang diberikan di Cache
string sUser = Convert.ToString(Cache[sKey]);
//Periksa apakah ada
if (sUser == null || sUser == String.Kosong)
{
Session["username"] = sName;
//Tidak ada item untuk Kunci ini di Cache, yang menunjukkan bahwa pengguna belum login, atau waktu login telah habis.
//TimeSpan mewakili interval waktu dan memperoleh nilai pengaturan sistem untuk waktu tunggu sesi.
//(Jika Anda menganggap bahwa waktu yang diperbolehkan bagi pengguna untuk masuk lagi kurang dari batas waktu sesi, nilai ini dapat diatur lebih kecil)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Untuk demonstrasi di sini, interval penyimpanan Cache diatur ke 20 detik.
Rentang Waktu SessTimeOut = Rentang Waktu baru(0, 0, 0, 20, 0);
HttpContext.Saat ini.Cache.Sisipkan(
sKey,
sKey,
batal,
TanggalWaktu.Nilai Maks,
SesTimeOut,
System.Web.Caching.CacheItemPriority.Tidak Dapat Dilepas,
batal
);
//Mulai Pengatur Waktu
this.Timer1.Enabled = true;
//Saat Anda masuk untuk pertama kali, Anda dapat melakukan pekerjaan yang ingin Anda lakukan.
Label1.Teks = "Halo!" + sNama + "Selamat datang";
}
kalau tidak
{
//Catatan pengguna ditemukan di Cache, menandakan bahwa dia sudah login dan dilarang login lagi.
Label1.Text = "Maaf, identitas pengguna Anda telah login";
kembali;
}
}
catch (Sistem.Pengecualian ex)
{
Label1.Teks = ex.Pesan;
}
}
void yang dilindungi Button2_Click(pengirim objek, EventArgs e)
{
//nama belakang
string sName = TextBox1.Text;
//Buat Kunci
string sKey = sName + "_Login";
//Untuk kenyamanan pengujian, metode ini diatur untuk menghapus informasi login dari Cache
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["nama pengguna"] + "Informasi login pengguna telah dihapus dari Cache!";
}
dilindungi void Timer1_Tick(pengirim objek, EventArgs e)
{
if (Sesi["nama pengguna"] != null)
{
//nama belakang
string sName = TextBox1.Text;
//Buat Kunci
string sKey = sName + "_Login";
//Dapatkan nilai Kunci yang diberikan di Cache
string sUser = Konversi.ToString(Cache[sKey]);
Rentang Waktu SessTimeOut = Rentang Waktu baru(0, 0, 0, 20, 0);
jika (sPengguna != nol)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Saat ini.Cache.Sisipkan(
sKey,
sKey,
batal,
TanggalWaktu.Nilai Maks,
SesTimeOut,
System.Web.Caching.CacheItemPriority.Tidak Dapat Dilepas,
batal
);
}
kalau tidak
{
this.Timer1.Enabled = false;
}
}
}
Contoh kode:/Files/heekui/WebLogin.rarPostscript
:
1 Metode ini layak untuk menilai login berulang kali oleh pengguna, tetapi juga disertai dengan masalah lain. Jika Timer diatur untuk bekerja secara teratur, Sesi tidak akan pernah kedaluwarsa selama tidak keluar secara normal atau menutup browser. Apakah hal ini akan memberikan dampak negatif?
2 Cara ini akan mengirimkan permintaan ke server secara berkala untuk setiap pengguna, yang tentunya akan menambah beban pada server. Jika ada banyak orang yang online pada saat yang sama, apakah permintaan seperti ini akan berdampak besar pada server?
Oleh karena itu, kami hanya dapat mengatakan bahwa cara di atas hanyalah cara yang layak, tetapi belum ada pengujian apakah sudah optimal. Saya tidak tahu apakah Anda punya cara yang lebih baik.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html