清华电脑学堂:ASP.NET 4.5网站开发与应用实践教程
上QQ阅读APP看书,第一时间看更新

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在不同的浏览器登录,这样可视为重复登录。感兴趣的读者可以重新完善本节的代码,这里不再显示具体的实现过程。