Asp.Net Session生命周期

Asp.Net中的Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的。  在传统web编程语言(比如asp)中,session的...

  Asp.Net中的Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的。

  在传统web编程语言(比如asp)中,session的过期完全是按照TimeOut来老老实实处理的,超时值默认是20分钟,但问题是:通常有很多用户只看一眼网页,然后就关浏览器走人了,这种情况下,服务端内存里还长久保存着Session的数据,如果这种用户很多,对服务器资源无疑是一种浪费。默认情况下,系统采用的是InProc模式,即进程内模式。这种情况下,Session是保存在Asp.Net工作进程映射的内存中的,问题是Asp.Net工作进程为了维护良好的平均性能,会被系统经常回收。我们在IIS里可以配置自动回收(比如按时间周期回收,或者当内存使用达到多少值时自动回收)。 当Asp.Net工作进程被回收时,其映射的内存全部被清空并初始化,以便其它程序可以使用,所以Session也跟着一并消失了,就这是为什么Sesssion会无故消失的主要原因。

一、session是怎么存储,提取的?

1.在服务器端有一个session池,用来存储每个用户提交session中的数据,Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端,而这个SessionID是一cookie的方式保存的在客户端的内存中的,如果想要得到Session池中的数据,服务器就会根据客户端提交的唯一SessionID标识给出相应的数据返回。

2.输入正确的账号密码,点击登录,页面就会输出  “admin --- 点击登录”

二、Session池中每个客户端的数据是怎么存储的?

1.存储在Session池中的数据是全局型的数据,可以跨页面访问,每个SessionID中只存储唯一的数据,如:首先你这样设定:session["userName"]="admin",然后你在会话还没结束的session还没过期的情况下,你又设定:session["userName"]="123";这样这个SessionID没变,然而Session池中的数据则被覆盖。此时session["userName"]的值就是“123”,而不是其它。

2.Session池中的数据不能跨进程访问。如:打开login.aspx页面写入session[“userName”]="admin";然后login页面不关闭,即此会话不结束,在这是你再在另外一个浏览器中打开一个login.aspx页面则session["userName"]=null

3.输入账号密码,点击登录页面输出  “admin --- 点击登录” ,如果紧接着点击获取session按钮,则页面只输出"admin--- 点击获取session",如果页面不关闭,打开另外一个浏览器,点击获取session按钮,则页面没法应。

三丶session的声明周期与销毁

1.session存储数据计时是滚动计时方式。具体是这样的,如果你打开写入session,从写入开始,此页面如果一直没有提交操作,则默认时间是20分钟,20分钟后session被服务器自动销毁,如过有提交操作,服务器会从提交后重新计时以此类推,直至设定时间内销毁。

2.可以设置session的销毁时间。上面代码有提到。

四丶session中保存的数据是在服务端的,而每个用户如进行登录操作,都要进行session数据写入,所以建议慎用session,就是少用。

五丶代码举例:

html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
< head  runat = "server" >
     < title ></ title >
     < script  src = "Scripts/jquery-1.4.1.min.js"  type = "text/javascript" ></ script >
     < script  type = "text/javascript" >
         function getSessionClick(action) {   //这个函数是为了知道哪一个提交按钮被点击
             $("#hidlgc").val("");  //清空隐藏值
             $("#hidlgc").val(action);   //给隐藏控件赋值
         }
     </ script >
</ head >
< body >
     < form  id = "form1"  method = "post"  action = "MySession.aspx" >
          < table >
             < tr >
                 < td >账号:</ td >< td >< input  type = "text"  name = "txtUid"  /></ td >`
             </ tr >
              < tr >
                 < td >密码:</ td >< td >< input  type = "password"  name = "txtPwd"  /></ td >
              </ tr >
              < tr >              
                 < td  colspan = "2" >
                     < input  type = "hidden"  value = ""  id = "hidlgc"  name = "hidlgclick"  />
                     < input  onclick = "getSessionClick('lgclick')"  type = "submit"  value = "登录"  />
                     < input  type = "submit"  onclick = "getSessionClick('getSession')"  value = "获取session"  />
                     < input  type = "submit"  onclick = "getSessionClick('backLg')"  value = "退出登录"  />
                 </ td >
              </ tr >
          </ table >
     </ form >
</ body >

asp.net后台处理代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
protected  void  Page_Load( object  sender, EventArgs e)
         {
             //把用户id写入session中
             if  (Request.Form[ "hidlgclick" ] ==  "lgclick" )
             {
                 if (Request.Form[ "txtUid" ].ToString()== "admin" &&Request.Form[ "txtUid" ].ToString()== "admin" //判断用户登录
                 {
                     Session[ "userName" ] = Request.Form[ "txtUid" ].ToString();   //把用户id保存到session中
                     Response.Write(Session[ "userName" ].ToString()+ "---点击登录" );  //获取session,并写入页面
                 }
             }
             //获取Session
             if  (Request.Form[ "hidlgclick" ] ==  "getSession" )
             {
                 if  (Session[ "userName" ] !=  null )
                 {
                     Response.Write(Session[ "userName" ].ToString() +  "---点击获取session" );  //获取session,并写入页面
                 }
             }
             //取消当前会话,相当于注销(退出登录)。
             if  (Request.Form[ "hidlgclick" ] ==  "backLg" )
             {
                 Session.Abandon();
             }
         }

设置session的过期时间

1
2
<system.web>
    <sessionState timeout="40"></sessionState>  <!---设置session的过期时间,时间以分钟为单位-->
博主自己创建了一个论坛:竹林论坛,一个专业的IT资源分享网站,里面各种最新的IT学习资料,欢迎大家访问竹林论坛(http://www.aogo.shop) 点击打开链接

猜你喜欢

转载自blog.csdn.net/l312770312/article/details/79389107