黑马程序员_学习笔记13_asp.net之Session原理解析

本文介绍了ASP.NET中的Session机制,包括其工作原理、数据结构及如何通过Cookie标识用户并管理会话状态。通过示例代码展示了如何创建和读取Session。
---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------


在ASP.NET中,我们使用Session来保持用户浏览器和客户端之间一种联系。Session实质上是通过想客户端发送一个cookie,

用来唯一标示当期那浏览器对象和服务器中对应的cookie值得一个服务器内存中的信息。


Session的存放数据格式是这个样子的:

IDictionary<string, IDictionary<string, object>>

它是一个键值对的泛型集合中,在嵌套另一个键值对。

其中第一个键中的string就是存放 服务器端和浏览器之间联系的唯一标识符。

第二个值中,是嵌套的一个IDictionary<string, object>它就是当前浏览器存放对应存放在服务器内存中的数据了

因为Session本身也是由键值对来对用户存储在服务器端的数据进行索引的,所以第一个string存放的就是索引值,第二个

object存放的就是与当前索引值对应的数据了。这些数据都是存放在服务器端的,客户端只向服务器提供存放当前键值对的

索引,此索引就是利用Cookie向服务器发送的。

所以Session使用,是建立在Cookie上的。


下面我来顶一个个完整的Session管理代码,来模仿ASP.NET 中的Session管理机制。

public class SessionMgr

{

          //访问当前站点的所有的用户的Session值都是存放在这个data中的。

          private static IDictionary<string, IDictionary<string, object>> data = new private static IDictionary<string, IDictionary<string, object>>();

        //返回当前session

        public static IDictionary<string,object> GetSession(string sessionId)

        {

                      //如果在当前服务器的所有Session容器data中,存在一个sessionId 为当前sessionId的

                    //就直接返回当前IDictionary<string, object>结构(session本身也就是这种结构)

                      if(data.ContainsKey(sessionId))

                       {

                                      return data[sessionId];

                       }

                      else//否则 就利用该sessionId唯一标识符给用户创建一个新的Session结构,也就是(IDictionary<string, object>结构)

                         {

                                           IDictionary<string, object> session = newIDictionary<string, object>();

                                           data[sessionId] = session;

                                           return session;

                         }

       }

}


上面我们就模拟了一个可以通过cookie向客户端发送一个唯一标识符,并且通过此唯一标识符能在服务器端为当前用户

创建一个数据结构为子典型的一个对象。


当用户第一次浏览我们的网页的时候,肯定是没有Session的(原因是,要想有Session,就必须先通过cookie想浏览器发送一个唯一标识符)



Protect void Page_Load(object sender,EventArgs e)

{

        //用户第一次浏览本站网页

       if(!ispostback)

        {

                   //象服务器发送一个key为MySessionId,Value 为Guid的这么一个cookie

                 Response.SetCookie("MySessionId",Guid.NewGuid().ToString());

       }

}

运行了此段代码之后,用户浏览器就会拥有一串很长的字符串用于标识,当前用户和服务器之间的对应关系。


上述还只是向浏览器发送cookie而已,我们下一步需要使用该cookie来帮助用户在服务器端开辟一个只属于该

用户的空间。比如在一个单击按钮里面进行。


pubilc void btn_click(object sender,EventArgs e)

{

         //首先第一步,我需要收到用户从浏览器那边给我发送过来的cookie值。

        //这个值 就是我在上面page_load事件里给用户发送的那个guid的值

        string MySessionId = Request.Cookie["MySessionId"].value;

         //然后我们通过这个唯一标识符 GUID MySession来为用户在服务器这边创建一个数据类型

        //为子典型的对象

       //当然因为一开始 存放所有用户session的容器data肯定都是空的

      //所以第一次(我这里的第一次,就是真的当天的第一个网站的访问者)

       //这个GetSession方法 返回的肯定是一个新的子典型的数据结构。IDictionary<string,object>

       IDictionary<string,object>  Session = SessiomMgr.GetSession(MySessionId);

       //然后,我们在使用用户传过来的cookie值创建的子典型对象赋值,用来在服务器内存中存放只与当前用户相关的信息

      //比如用户名 和 积分

     Session["用户名"] = "李宇春";

     Session["积分"] = 100;

    //Session[key]本身是一个object类型,在.NET中拥有集成链的数据类型之间,派生类到基类的转换是隐式的,不需要你

    //显示写出。所以实际数据是转化为object存放在当前的子典型数据中的

}

 

//然后,我们可以在另一个按钮的单击事件中来检测使是否在服务器中为当前用户开辟了一个用户存放子典型字段的这么一个空间。

protect void btn2_click(object sender,EventArgs e)

{

           //首先我们还是需要通过获取当前用户的cookie来判断是哪个用户在请求自己的Session

          string MySessionId = Request.Cookies["MySessionId"].value;

           //这里注意,我们象所有用户发送的cookie这么一个键值对的数据中,所有的键都是一样的,他们都是

          //MySessionId.唯一的区别是值,值是在服务器端动态创建的一个GUID唯一标识符

           //申明一个键值对去接收通过当前cookie值在data中索引到的Session键值对数据

          IDictionary<string, object>  MySession = SessionMgr.GetSession(MySessionId);

          //这个时候,我们就取到了当前用户存放在data中的session键值对了

         //然后通过 Session[key] = value;的形式访问session中的值。

         Label1.Text = "用户名为:"+ Conver.ToString(MySession["用户名"]);

        Label2.Text = "积分为:"+Conver.ToString(MySession["积分"]);

        //到此我们就可以顺利的取到当前用户存在服务器里的键值对数据了。

}




---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
详细请查看: http://net.itheima.com/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值