无状态http和常用状态保持方式

     浏览器和服务器使用Socket通信,服务器把请求结果返回到浏览器后,socket连接就会关闭,服务器会在处理页面完毕后销毁页面对象。当浏览器再次和服务器进行通信时,服务器已经不记得上次是怎么处理网页的请求的。

     当用户输入一些信息,想要跳转到下一个页面的时候,数据就会丢掉,再也获取不了那些数据了。因此我们需要记录上一次的状态信息。

常用的信息保存方式有四种:

一、Application(作用于整个运行期的状态对象)

Application对象在网络中的用途就是记录整个网络的信息,如上线人数,在线名单,意见调查和网上选举等功能。在给定的应用程序之间共享信息。在服务器运行期间使数据持久保存。它还有控制访问应用层数据的方法和应用程序启动和停止时触发过程的事件。

1.使用Application对象保存信息:

  Application("名称")=值    或    Application("名称",值)

  获取Application对象信息:

  变量名=Application("名称")  或  Application.Item("键名")

  更新Application对象的值:

  Application.Set("名称",值)

  删除一个键:

  Application.Remove("名称",值)

  删除所有键

  Application.RemoveAll()   或  Application.Clear()

2.因为Application可以再给定的应用程序之间共享信息,这样就有可能出现多个用户同     

      时使用一个Application对象,造成数据的不一致。HttpApplicationState类提供两种方 

     法LockUnlock,以解决Application访问同步的问题,一次只允许一个线程访问应用   

     程序状态变量。

     例如:

     锁定:Application.Lock();     

     访问:Application("名称")=;      

     解锁:Application.Unclock();

     可用于网站访问人数,聊天室等设备。

二、将页面信息保存在viewState中,其实就是在页面上的一个隐藏域中保存客户端信息。

     (1)用户使用viewState保存方式:

     ViewState["key"]="haha";

     读取数据的方式:

     string str;

     if(ViewState["key"]!=null)

     {

       str=(string)ViewState["key"];

     }

   注意:ViewState不能存储所有的数据类型,但支持可序列化对象。

         非单值服务器控件的状态也能保存在ViewState中。

         当页面上有一个服务器端窗体标记<form runat="server">时才可以使用   

         ViewState;

         服务端接收到页面的请求,会查看请求报文中是否含有—ViewState,隐藏  

         域,如果有,将中间的值解码后添加到页面的ViewState属性中

               ViewState适用于同一个页面在不关闭的情况下多次与服务器交互。

 

         禁用ViewState的方法:

             禁用单个控件将控件属性enableviewstate=false.

             禁用整个页面的viewState,aspxPage指令区加上EnableViewState="false"

             WebFormIsPostBack依赖于_ViewState

三、Cookie:使用的场景就是可以再浏览器端记住用户访问过的状态。     

         浏览器保存Cookie有两种方式:        

         1—浏览器的内存中;        

        2—浏览器所在的电脑的硬盘中。为将要写入到浏览器的Cookie对象设置失效时间

           cook.Expires = DateTime.Now.AddMinutes(5);//设置cook5分钟后失效

           浏览器发来的CookieExpires属性值是无效的.(浏览器在向服务器发送Cookie 的时候,没有将Cookie的失效时间发送过去)

 

           服务器设置Cookie

           HttpCookie cok = new HttpCookie(uId10001);//(“键”,”值”)

       cok.Expires = DateTime.Now.AddDays(18);//设置失效日期-现在之后的18天后

           context.Response.Cookies.Add(cok); //添加到响应中

 

            服务器获得客户端传来的Cookie

            string strUName=context.Request.Cookies[uId].Value;//从请求中获得Cookie

            Response.cookies["userName"].expire=datetime.now.adddays(-1);就是把当前的   

            cookie删除了。

 

          Cookie原理:普通GET请求,是没有Cookie(可以用HttpWatch工具查看)服    

      务器通过响应报文头里的setcookie向浏览器设置Cookie信息,浏览器通过请求  

      报文头 里的Cookie传递浏览器存储的Cookie信息

 

四.Session:提供了一种把信息保存在服务器内存中的一种方式。它可以存储任何数据类   

     型还包括自定义对象。

 每个客户端的Session是独立存储的,它用于存储有关用户的信息,在整个会话中,   

 都会保留这个信息,当用户在应用程序中从一个网页浏览到另一个网页时,Session仍  

 然可以维持保留用户的这个信息。Session只可由该会话的用户访问,它以带有

     SessionIdcookie方式保存在访问者的浏览器端了,当会话过期或终止时,服务器就  

     会清除Session对象。常用语保存登录用户ID

        1)将新的项添加到会话状态中 

           语法格式为: 

           Session (键名) =     或者     Session.Add( 键名” 

        2)按名称获取会话状态中的值 

          语法格式为: 

          变量 = Session (键名 或者    变量 = Session.Item(键名

        3)删除会话状态集合中的项 

          语法格式为: Session.Remove(键名

        4)清除会话状态中的所有值 

         语法格式为: Session.RemoveAll()    或者    Session.Clear() 

        5)取消当前会话 

          语法格式为: Session.Abandon() 

        6)设置会话状态的超时期限,以分钟为单位。 

           语法格式为:  Session.TimeOut = 数值 

           Global.asax文件中有2个事件应用于Session对象 

           Session_Start在会话启动时激发 

           Session_End在会话结束时激发 

 

 

     

 

   

     

原文地址:https://www.cnblogs.com/hanwenhuazuibang/p/3000256.html