Cookie和Session的总结

      在ASP.NET中主要使用Cookie,Session,Application这些对象属性来记录一些信息的,这样有效的减少了维护程序状态的困难.

Cookie  

   原理:

         服务器创建一个Cookie时,会附加一个Http请求头发送到浏览器,其形式如:

             Set-Cookie:msg=Hello Asp.net

         这个语句就创建了一个名为msg的cookie,其值就是Hello Asp.net,当浏览器创建好这个Cookie时,再对该服务器请求页面时,就会发送一个Http头部

          Cookie:msg=Hello Asp.net

         实际上每次请求页面时,这个Http都会被发送回服务器 ,Cookie的设置是因浏览器而有差异的,并且其只能存储字符串,而且不要存放敏感信息,因为

其是明文形式存储的,所有的Cookie都是域名相关的,也就比如说博客园网站设置的Cookie,腾讯网站是访问不到的。

         对于Cookie还有一个比较关键的限制就是大小,包括Cookie名称和值在一个域名里存储的字节不能超过4M,有的浏览器会对Cookie的数量进行限制,

比如说一个域名内不能超过20个Cookie,最后也要注意的是浏览器可以禁用Cookie

     创建:  

        Response.Cookies["msg"].Value = "Hello Asp";

     Cookie名称是区分大小写的,如果要修改值,只需要重新赋值就可以

     如果要创建一个持久化的Cookie,需要给其设置一个过期时间

         Response.Cookies["msg"].Expires = DateTime.Now.AddDays(1);

     可以创建多值Cookie,这样可以越过单个域名不能超出20个Cookie的限制

         Response.Cookies["msg"]["ID"] = "Hello Asp";
         Response.Cookies["msg"]["passwd"] = "123";

   读取:

         if (Request.Cookies["msg"] != null)
        {
            string value = Request.Cookies["msg"].Value;
        }

      读取之前要判断一下是否存在,防止引起空异常,

   删除:

          删除一个存在的cookie,只需要设置过期时间为过去的一个日期

         Response.Cookies["msg"].Expires = DateTime.Now.AddDays(-1);

        若需要删除当前域名下所有Cookie

        string[] cookie = Request.Cookies.AllKeys;
        foreach (string ck in cookie)
        {
            Response.Cookies[ck].Expires = DateTime.Now.AddDays(-1);
        }

  Session 

         原理:

                使用Session状态时,一个名为ASP.NET_SessionId的Cookie会添加到浏览器,其可以在页面切换时跟踪用户,向Session中

添加值时,会存在服务器上,而不是浏览器上,ASP.NET_SessionId则用于管理用户和数据

          处理Session事件:

               主要在Global.asax中处理Session_Start与Session_End,这里主要说明一下,只有默认的InPro会话存储会触发Session_End事件

          会话失效:

         <system.web> <sessionState timeout="30"></sessionState> </system.web>
默认为20分钟,增加时间会使应用程序消耗更多内存。
       配置无Cookie的Session状态

             前面提到用ASP.NET_SessionId识别用户,问题是当禁用Cookie时,Session就无法工作了。

            通过配置文件启用无Cookie的Session

                <sessionState cookieless="AutoDetect" regenerateExpiredSessionId="true"></sessionState>
        启用了之后,页面的URL中会出现SessionId的值,如http://local:49823/Manager/(SessionId的值)/a.aspx,因此页面最好使用
相对URL进行链接,否则SessionId无法自动添加至绝对URL中,对上面的配置简单的说明一下:cookieless有多个值,AutoDetect表示
浏览器启用cookie时,SessionID保存在cookie中,否则就添加至URL,其它的就不一一说明了,regenerateExpiredSessionId为true,可以防
止用户共享Session状态

          配置Session存储状态:

          InProc中的Session很容易丢失,比如修改Web.config导致应用程序重启,其次其是保存在特定服务器上,可伸缩性较差,那么对于Session状态

模式有几种可选项,进程内的Session拥有最好的性能,设为StateServer或者SQLServer时,则用性能换取了健壮性和伸缩性。

         a,配置StateServer的Session状态

             在管理工具中启动ASP.NET State Servers,启用Start,并设置启动类型为Automatic,启动之后配置应用程序使用它

       <sessionState mode="StateServer" sqlCommandTimeout="30" sqlConnectionString="Data Source=.;Integrated Secutity=True"
       ></sessionState>

        sqlConnectionString 指定ASP.NET状态服务器的位置,sqlCommandTimeout表示连接超时妙数,完成这些设置后,Session状态被自动保存在本地

ASP.NET状态服务器中.

         b,配置SQLServer 状态

               这个比较繁琐,主要步骤有2步,首先要配置数据库,其次再配置应用程序使用该状态,

          配置数据库可通过SDK命令行

              aspnet_reqsql –C  “Data Source=.;Integrated Secutity=True”即可启动SQLServer Session状态,其默认保存在TempDB中,如果希望

重启数据库Session状态依旧有效,则不要将其保存在TempDB中

              aspnet_reqsql –C  “Data Source=.;Integrated Secutity=True” –ssadd –sstype p则将其保存到ASPState中,也可以保存到自定义DB中

              aspnet_reqsql –C  “Data Source=.;Integrated Secutity=True” –ssadd –sstype c –d MyDB

              若要从服务器移除,则执行aspnet_reqsql –C  “Data Source=.;Integrated Secutity=True” -ssremove即可,具体参数含义可以查看MSDN

               配置Web.config时和StateServer的Session状态配置只有mode方式的不同

        <sessionState mode="SQLServer" sqlCommandTimeout="30" sqlConnectionString="Data Source=.;Integrated Secutity=True"
         ></sessionState>
posted @ 2010-08-17 13:06  ringgo  阅读(4649)  评论(0编辑  收藏  举报