session状态管理相关小结

HTTP协议是无状态的,于是session和cookie发挥了作用。
服务端不能主动连接客户端,只能被动等待并答复客户端请求。客户端连接服务端,发出一个HTTP Request,服务端处理请求,并且返回一个HTTP Response给客户端,本次HTTP Request-Response Cycle结束。
HTTP Request一般由3部分组成:
(1)Request Line
这一行由HTTP Method(如GET或POST)、URL、和HTTP版本号组成。
例如,GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
GET http://www.google.com/search?q=Tomcat HTTP/1.1
POST http://www.google.com/search HTTP/1.1
GET http://www.somsite.com/menu.do;jsessionid=1001 HTTP/1.1

(2)Request Headers
这部分定义了一些重要的头部信息,如,浏览器的种类,语言,类型。Request Headers中还可以包括Cookie的定义。例如:
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Accept-Language: en-us
Cookie: jsessionid=1001

(3)Message Body
如果HTTP Method是GET,那么Message Body为空。
如果HTTP Method是POST,说明这个HTTP Request是submit一个HTML Form的结果,
那么Message Body为HTML Form里面定义的Input属性。例如,
user=guest
password=guest
jsessionid=1001
主意,如果把HTML Form元素的Method属性改为GET。那么,Message Body为空,所有的Input属性都会加在URL的后面。

实现session有以下几种方法
(1)Cookie(默认)。
Response时,将sessionid存入Cookie,Request时 再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样服务器就可以辨别是哪个session。
 string szCookieHeader = Request.Headers["Cookie"]//获取cookie
从szCookieHeader 获取sessionid。
(2)URL重写。
通过在 URL 中自动增加会话 ID 实现状态保持。

附:
asp.net支持的session模式
      InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中。这是默认设置。
      StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
      SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。
      Custom 模式,此模式允许您指定自定义存储提供程序。
      Off 模式,此模式禁用会话状态。
SQL Server 状态服务器管理会话状态
需要创建一些特殊的数据库
  InstallPersistSqlState.sql-包括建立数据库的脚本,这个数据库是持久状态管理中要用到的。
  UninstallPersistSqlState.sql-包括卸载持久状态管理的脚本。
  UninstallSqlState.sql-包括卸载状态管理的脚本。

“只要关闭浏览器,session就消失了”这种看法是错误的
如果session使用会话cookie来保存session id,关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。但如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

sesson cookie和persistent cookie的区别:
session通过SessionID来区分不同的客户,session默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做 session cookie,以区别persistent cookies,也就是我们通常所说的cookie,前者是存储于浏览器内存中的,后者是写到硬盘上的。
我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,就可以在地址栏看到sessionid= KWJHUG6JJM65HS2K6之类的字符串。
session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。

session cookie在某些情况下可以跨浏览器页面共享
IE中:
  有效的窗品包括
  1.Session对象只在建立Session对象的窗口中有效。
  2.在建立Session对象的窗口中新开链接的窗口

  无效的窗口包括
  1.直接启动IE浏览器的窗口
  2.不是在建立Session对象的窗口中新开链接的窗口
  3.弹出模式窗口的时候

NetScape中:
  只要一个窗口有了某个Session对象,则全部窗口对此Session都有效

persistent cookie可以跨浏览器共享数据
为了都能达到都能共享的目的,我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。

posted @ 2007-05-24 20:20 jecray 阅读(650) 评论(0) 编辑 收藏