3.6 Session对象
学习目标
学习并掌握Session对象的使用方法。
3.6.1 Session对象功能描述
ASP.NET会话状态能当用户在构成Web应用程序的不同ASP.NET页面之间导航时,为用户存储和检索值。HTTP是无状态协议,这意味着Web服务器将页的每个HTTP请求都当作相互无关的请求进行处理;默认情况下,服务器不保留上一个请求期间使用的变量的值的任何信息。因此,如果要想生成需要维护某些跨请求状态信息的Web应用程序(如实现购物车、数据滚动等的应用程序),就可能会非常困难。ASP.NET会话状态将有限时间(Session.Timeout默认为20min)段内从同一个浏览器接收到的请求标识为一个会话(Session),并在该会话持续期间保留变量的值。
默认情况下,所有的ASP.NET应用程序都启用ASP.NET会话状态。使用Session属性(将会话变量的值存储为按名称索引的集合)可方便地设置和检索ASP.NET会话状态变量。ASP.NET默认情况下将会话信息存储在ASP.NET应用程序的内存空间。
3.6.2 定义和使用Session
1.定义Session变量
定义Session变量可以采取多种方法完成,下面的示例给出了3种不同定义Session变量的方法,效果等价。
Session.Contents.Add("var1", "1000"); Session.Add("var2", "2000"); Session["var3"] = "3000";
2.定义Session变量有效期
Session变量默认有效期为20min一般都能够正常使用,理解Session.Timeout属性的默认值为200min可以和屏幕保护的启动时间比较理解,例如屏幕保护程序的启动时间为20min,意思为用户200min内不操作计算机则屏幕保护程序启动,同样,Session.Timeout属性的默认值200min也是讲用户如果两次访问该变量的间隔时间超过了200min,服务器就自动释放该Session变量。当需要人为设置Session变量有效期时可以使用如下代码。
Session.Timeout = 30;
3.读取Session变量
读取Session变量可以采取多种方法完成,下面的示例给出了读取Session变量的不同方法,效果等价。另外用户还可以使用Session.SessionID获取当前的Session变量的唯一标识。
string var1 = Session.Contents["var1"].ToString(); string var2 = Session["var2"].ToString();
4.释放Session变量
默认情况下如果用户在有限时间内(Session.Timeout)没有访问指定的Session变量,那么Session变量(即Session.SessionID)将被系统自动释放,用户也可以人为强制释放,经常用于退出登录、注销等。代码如下:
Session.Abandon();
3.6.3 实例分析:使用Session完成一个会员登录系统
用户在通过HTTP协议访问一个主页时,每次连接时都要重新开始。因此,如果要判别某个用户是否曾经进入本网站,除了前面所讲的Cookies技术外还可以使用Session完成。当用户第一次访问网站时,可以定义Session变量存储在服务器端,当用户再次访问此网站时,则可以从Session对象的Contents集合中直接获取相关信息。网络上很多论坛、购物车、网站后台管理的登录系统就是使用Session来保存用户登录信息的。
本实例要给出的正是这种登录系统使用Session保存用户信息的实现方法,需要用到用户表信息,这里使用的用户数据库和3.4.10节的数据库脚本完全相同,数据库脚本代码不再给出。
(1)在ASP.NET网站项目StudyObject中添加页面myLogin.aspx,并在工具箱中的“标准”选项卡中选择相关控件添加到页面,布局页面如图3-19所示。
(2)在图3-19中直接双击“登录”按钮进入该按钮的单击事件代码编写窗口,编写登录处理代码,接下来给出完成登录处理代码。(注意:myLogin.aspx.cs
中必须导入操作数据SQL Server的命名空间,如“using System.Data.SqlClient;”)
。
protected void btnConfirm_Click(object sender, EventArgs e) { string Username = txtUsername.Text.Trim(); string Password = txtPassword.Text.Trim(); SqlConnection conn = new SqlConnection(); conn.ConnectionString = @"server=DUANKEQI;uid=sa;pwd=sa; database=userDB"; string sqlString = "select Username,Password from userTable where Username='" + Username + "'"; SqlDataAdapter sda = new SqlDataAdapter(sqlString, conn); DataSet ds = new DataSet(); sda.Fill(ds); if (ds.Tables[0].Rows.Count == 0) { //说明输入的用户名不存在 Response.Write("<script language='javascript'>alert(' 用户名称输入错误');history.back();</script>"); Response.End(); } else { //说明输入的用户名存在,再判断口令是否正确 string Password_db = ds.Tables[0].Rows[0]["Password"]. ToString(); if (Password == Password_db) { //说明口令正确,于是定义Session变量以及有效期 Session["Username"] = Username; //处理完毕后重定向到登录成功页面,比如为Success.aspx Response.Redirect("mySuccess.aspx"); } else { //说明口令不正确 Response.Write("<script language='javascript'>alert(' 口令输入错误');history.back();</script>"); Response.End(); } } }//btnConfirm_Click
(3)在ASP.NET网站项目StudyObject中再添加页面mySuccess.aspx,作为登录成功后显示的页面,并在工具箱中的“标准”选项卡中选择相关控件添加到页面,布局页面如图3-20所示。
(4)在图3-20中右击,在弹出的快捷菜单中选择“查看代码”命令,进入my Success.aspx.cs代码编写窗口,编写Page_Load代码如下。
protected void Page_Load(object sender, EventArgs e) { string Username = string.Empty; if (Session["Username"] == null) { Username = ""; } else { Username = Session["Username"].ToString(); } if (Username == "") { Response.Write("<script language='javascript'>alert('你没 有登录不可以查看此页面');location.href='myLogin.aspx';</ script>"); Response.End(); } lblUsername.Text = Username; }
(5)在网页mySuccess.aspx中直接按Ctrl+F5组合键,页面首次运行效果如图3-21所示。
(6)在图3-21中单击“确定”按钮直接进入登录页面myLogin.aspx,如图3-22所示。
(7)在图3-22中如果输入错误的用户名和口令都会提示错误,最终返回到myLogin.aspx页面,正确输入用户名称"admin"和口令"1234"后,单击“登录”按钮,显示的即是登录成功后页面mySuccess.aspx显示的效果,如图3-23所示。
(8)另外登录成功页面严格讲还应做一个退出按钮,退出按钮事件代码就是让Session失效即可,即释放Session,代码如下:
Session.Abandon();
共有条评论 网友评论