• 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>
  • 相关阅读:
    docker search 报错
    mgo连接池
    饿了么这样跳过Redis Cluster遇到的“坑”
    Linux Swap的那些事
    epoll使用详解(精髓)(转)
    select、poll、epoll之间的区别总结[整理](转)
    git merge 和 git rebase 小结(转)
    linux查看端口占用情况
    [LeetCode] Combinations——递归
    C++中的static关键字的总结(转)
  • 原文地址:https://www.cnblogs.com/626498301/p/1801406.html
Copyright © 2020-2023  润新知