5.5 实验指导——Cookie对象实现免登录
经常上网的开发者会知道,用户在某个系统或网站的登录页实现登录功能时,通常有一个复选框提示用户是否在某一段时间内免登录,如三天内免登录、一周内免登录。本节模拟实现用户登录功能,通过Cookie保存过期时间,在两分钟内实现免登录。步骤如下。
(1)创建Login.aspx窗体页,在页面的表单元素中添加【登录名】输入框、【登录密码】输入框、【两分钟内免登录】复选框、【登录】按钮以及显示信息的Label控件。代码如下。
<table align="center" height="150" width="50%"> <tr><td align="right" width="30%">登录名:</td><td><asp:TextBox ID="txtLoginName" runat="server"></asp:TextBox></td></tr> <tr><td align="right">登录密码:</td><td><asp:TextBox ID= "txtLoginPass" runat="server"></asp:TextBox></td></tr> <tr><td></td><td><asp:CheckBox ID="cbCheck" runat="server" Text="两 分钟内免登录" /></td></tr> <tr><td></td><td><asp:Button ID="btnLogin"runat="server"Text="登 录 " OnClick="btnLogin_Click" /></td></tr> <tr><td></td><td><asp:Label ID="lblMessage" runat="server" ForeColor="Red"></asp:Label></td></tr> </table>
(2)在后台页面为步骤(1)中的Button控件添加Click事件代码。首先判断用户输入的登录名是否等于admin,如果是则分别保存名称为CookieTime和Login的Cookie对象。然后判断是否选中复选框,如果选中则设置Cookie对象的Expires属性。最后调用Response对象的Redirect()方法跳转页面。代码如下。
protected void btnLogin_Click(object sender, EventArgs e) { if (txtLoginName.Text == "admin") { //登录名必须是admin,密码随意 Response.Cookies["CookieTime"].Value = txtLoginName.Text; Response.Cookies["LoginTime"].Value = DateTime.Now.ToString ("yyyy-MM-dd hh:mm:ss"); if (cbCheck.Checked) { //确定在两分钟内免登录 Response.Cookies["CookieTime"].Expires = DateTime.Now. AddMinutes(1); } Response.Cookies["LoginTime"].Expires = DateTime.MaxValue; Response.Redirect("~/Default.aspx"); } else { lblMessage.Text = "用户名错误"; } }
(3)打开当前应用程序根目录下的Defalut.aspx页面,在前台页面添加Label控件和LinkButton控件。代码如下。
<asp:Label ID="lblMessage" runat="server" ForeColor="Red"></asp:Label> <asp:LinkButton ID="lbExit" runat="server" Text="退 出" OnClick= "lbExit_Click"></asp:LinkButton>
(4)在后台中获取名称为CookieTime和LoginTime的Cookie对象,并判断它们的值是否为空,如果为空弹出提示并跳转页面,否则获取LoginTime中保存的值并输出到页面。代码如下。
protected void Page_Load(object sender, EventArgs e) { if (Request.Cookies["CookieTime"] == null || Request.Cookies ["LoginTime"] == null) { Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert(’不能查看页面内容,您可能没有登录,单击按钮确认登录 '); window.location.href='Cookie/Login.aspx'; </script>"); } else { string loginTime = Request.Cookies["LoginTime"].Value; lblMessage.Text = "当前时间:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + ",上次登录时间是:" + loginTime; } }
(5)为Default.aspx页面中【退出】按钮添加Click事件,重新设置Cookie对象的过期时间。代码如下。
protected void lbExit_Click(object sender, EventArgs e) { HttpCookie cookie = Request.Cookies["CookieTime"]; if (cookie ! = null) { cookie.Expires = DateTime.Now.AddMinutes(-2); Response.Redirect("Cookie/Login.aspx"); Response.Cookies.Set(cookie); } }
(6)直接运行Default.aspx页面查看效果,如图5-10所示。单击【确定】按钮跳转到登录页面,如图5-11所示。
图5-10 提示内容
图5-11 登录页面
(7)在如图5-11所示界面中输入登录名和登录密码,登录名必须为admin,否则会提示出错,如图5-12所示。重新在登录页面输入登录名和密码,并且选中图中的复选框,成功时的效果如图5-13所示。
图5-12 登录错误
图5-13 登录成功
(8)刷新页面或者重新打开一个新的窗口查看效果,效果图不再显示。
提示
本节实验指导模拟实现用户的免登录功能,在一个完整的功能强大的系统中,仅依靠本节的代码是不行的,它们存在着漏洞。例如,同一用户admin在不同的浏览器登录,这样可视为重复登录。感兴趣的读者可以重新完善本节的代码,这里不再显示具体的实现过程。