本节我们将完成管理员的登录和注销,这里要学习一个重要的知识点“会话(Session)”。因为HTTP协议是无状态非持续连接的协议,它没有办法识别客户端,也无法记住客户端的状态,所以需要使用额外的手段——会话Session,来记录客户端的状态。客户端每次访问服务器,服务器都会给它分配一个唯一的Session ID,来标示这个连接。如果客户端没有关闭连接,继续访问服务器的话,那它的的ID就没有变,服务器就知道,上一次连接和这一次连接时来自同一个客户端。如果客户端关闭连接,它的Session ID就清空,这时新开一个连接来访问服务器,服务器就会又分配一个新的Session ID来标示这个客户端。这就像我们访问QQ空间一样,需要先登录,登录后只要不关闭IE浏览器,Session ID没有变化,我们就可以任意的访问日志、相册等功能。如果我们关闭IE或者选择退出后,就会清空Session ID,这时我们再访问QQ空间,因为Session ID已经被清空,所以服务器不能识别我们刚才已经登录过了,所以分配给给我们一个新的Session ID,并要求我们重新登录。
Session 允许通过将对象存储在 Web 服务器的内存中,这样在整个用户会话过程中就可以通过保存的客户端信息来识别客户端,也可以暂存一些小的数据。在Session保存数据是用“键值对(Key-Value)”来实现的,键相当于ID,是一个唯一的标识符,值是我们需要存储的数据。ASP.NET中Session操作的语法如下:
Session.Add ( "AdminName", "张三" ); // 把 张三 这个字符串暂存在Session中,并给它一个标识符 AdminName
Session.Add ( "AdminID", "12" ); // 把 12 这个字符串暂存在Session中,并给它一个标识符 AdminID
string s1 = Session["AdminName"].ToString(); /* 从Session把标识符为AdminName的值取出来,转换成字符串,赋值给s1,s1 = "张三" */
string s2 = Session["AdminID"].ToString(); // s2 = "12"
在具备Session的知识之后,我们就可以开始完成用户登录和注销功能。
1、在网站根目录下(注意:管理员登录属于前台页面),新建一个页面Admin_Login.aspx,选择母版页MasterPage.Master 。打开设计视图,设计一个如下页面。其中,在用户名的上方,从工具箱中拖入1个Label控件,用来显示登录失败后的信息,用户名和密码后面拖入2个文本输入框TextBox控件,MaxLength=“20” 属性限定输入不超过20个字符,TextMode=“Password" 属性标示这是一个密码输入框。在用户名和密码输入框的后面,从【工具箱】-【验证】栏目中拖入2个“RequiredFieldValidator 必填选项验证控件 ”,然后选中第一个RequiredFieldValidator控件,打开属性面板,设置 ControlToValidate属性为TextBox1,表示这个验证控是验证TextBox1有没有输入内容;设置 ErrorMessage属性为“必填选项”,表示当TextBox1没有输入内容就提交时,提示“必填选项”这四个字。同理,选中第二个RequiredFieldValidator控件,设置 ControlToValidate属性为TextBox2,表示这个验证控是验证TextBox2有没有输入内容;设置 ErrorMessage属性为“必填选项”。最后再拖入一个Button按钮,Text属性为“登录”。
选择源视图,查看我们用到了哪些控件,以及每个控件设定了哪些属性:
<h3>用户登录:</h3><br /> <p> <asp:Label ID="Label1" runat="server" Text="" ForeColor="Red" Font-Size="Larger"></asp:Label> </p> <p> 用户名:<asp:TextBox ID="TextBox1" runat="server" MaxLength="20"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="必填选项"></asp:RequiredFieldValidator> </p> <p> 密 码:<asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="TextBox2" ErrorMessage="必填选项"></asp:RequiredFieldValidator> </p> <p> <asp:Button ID="Button1" runat="server" Text=" 登 录 " Height="24px" on </p> |
2、选择Admin_Login.aspx的设计视图,在登录按钮上双击,打开Admin_Login.aspx.cs页面,完成Button1_Click()方法:
protected void Button1_Click(object sender, EventArgs e) { // 先让Label1的文本为空字符串,隐藏错误信息 Label1.Text = ""; string s = "Provider=Microsoft.Jet.OleDb.4.0;Da using (OleDbConnection conn = new OleDbConnection(s)) { // 定义SQL语句,@Admin 表示这是一个占位符,@Password表示这是另外一个占位符 string sql = "select * from Admin where AdminName = @AdminName and [password] = @Password"; OleDbCommand cmd = new OleDbCommand(sql, conn); // 把TextBox1的输入框的内容赋值给@Admin占位符 cmd.Parameters.AddWithValue("@AdminName", TextBox1.Text); // 把TextBox2的输入框的内容赋值给@Password占位符 cmd.Parameters.AddWithValue("@Password", TextBox2.Text); conn.Open(); // 赋值完成之后,sql就是一条完整的查询语句 OleDbDataReader rd = cmd.ExecuteReader(); if (rd.Read()) { // 如果有记录,说明用户名和密码正确 // 把用户名放入Session中暂存起来,同时给它一个标识符 AdminName Session.Add("AdminName", TextBox1.Text); // 把用户ID放入Session中暂存起来,同时给它一个标识符 AdminID Session.Add("AdminID", rd["ID"].ToString()); // 把用户权限放入Session中暂存起来,同时给它一个标识符 Purview Session.Add("Purview", rd["Purview"].ToString()); // 登录成功,跳转到后台的管理员管理页面 Response.Redirect("admin/Admin_Man.aspx"); } else { // 用户名和密码不匹配,提示出错信息 Label1.Text = "用户名或密码错误,请重新输入!"; } } } |
3、继续Admin_Login.aspx.cs页面,在Page_Load()方法中,添加以下代码,清空Session中的数据:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 清空Session中暂存的数据 Session.Clear(); } } |
4、选择全部保存。然后打开后台母版页(admin文件夹里的MasterPage2.master),在设计视图下,输入“当前用户:”和“权限”,然后选择源视图,在当前用户和权限后,输入如下代码:
<h2>当前用户:<%= Session["AdminName"] %>;权限:<%= Session["Purview"] %> <a href="../Admin_Login.aspx">登录</a> | <a href="Admin_Add.aspx">新增管理员</a> | <a href="Admin_Man.aspx">管理员管理</a> | <a href="Class_Man.aspx">栏目管理</a> </h2> |
把Admin_Login.aspx设为起始页,我们就可以看到实际效果了:只有用户名和密码正确才能登录成功,试试不同用户,登录成功后会显示当前用户的用户名和权限。
这里需要重点提示,在新增管理员页面Admin_Add.aspx中,SQL语句的写法,"'" + TextBox1.Text + "','" +TextBox2.Text + "' " ... 这里TextBox1.Text前后的双引号中,是1个单引号,而不是空格单引号,像"' " + TextBox1.Text + " ',' " 错了。就像 "张三" 和 " 张三 " 是两个不同的字符串,第二个张三前后各有1个空格,第一个没有。所以,用户名密码正确,但登录不成功,检查一下Access数据库中Admin表中的AdminName和Password字段的值,前后是不是有多余的空格?
但这里还有一个小小的问题,就是如果我们运行Admin_Login.aspx页面后,并不登录,而是在地址栏中直接输入管理员管理页面的URL,也就是在地址栏中,把Admin_Login.aspx用admin/Admin_Man.aspx替换掉,然后回车,就可以避开登录,直接访问后台页面了。这是一个很危险的事情,我们需要完成用户登录的最后一个步骤。
5、打开后台母版页的cs文件,也就是MasterPage2.master.cs,在Page_Load()方法中,添加以下代码:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Session["AdminID"] == null) { // Session["AdminID"]为空,则说明没有登录;因为登录成功后,我们会把管理员的ID暂存在Session中 // 弹出一个警告框 Response.Write("<script>alert('请登录后访问本页面!');</script>"); // 跳转到登录页面 Response.Write("<script>location.href='../Admin_Login.aspx';</script>"); } } } |
6、选择全部保存,就可以看到完整的登录效果,在地址栏中试图输入URL来访问后台页面,好像不大可能了。哇,太酷了!在下一节课中,我们将完善用户登录程序,为它加上验证码,这离网站的成功又近了一步,同学们,好好加油!
此文重点突出,浅显易懂,帮转载,原文地址:
http://justinsoho.blog.163.com/blog/static/14078207220103881651169/