在网上东一段西一段的读了一些有关Cookie和Session的文章,自己也总结一下。
1, Cookie :分为2类
a) 会话性质的Cookie,存放于浏览器内存中,没有指定过期时间,当关闭浏览器时就失效
b) 存储在客户端硬盘上的Cookie,指定了过期时间,会将其保存在客户端得文件中
2,Session :保存在服务器上的用户数据,可以依赖于Cookie,也可以不依赖于Cookie,
当依赖于Cookie时,客户端和服务端通过互相传递一个SessionID来确定客户端用户的身份
当不依赖于Cookie时,可以通过Url参数来确实客户端用户的身份,格式为
http://localhost/UrlReWrite/(S(gzlhzp55q51okj45nx20scvk))/Main.aspx 红色部分即为加密过后的SessionID。
其过程如下:
Session是保存在服务端,默认情况下20分钟会清除对于不活动的session。清除是服务端行为,而不是客户端行为。因此即使关闭了浏览器,Session其实还没过期,一直还保留在服务器上,如果使用URL传递SessionID,当继续使用之前的SessionID访问服务器时,还会找到相应的用户信息。
在CSDN论坛上看到一个问题说如果服务端得Session被禁了,怎么模拟伪Session(一个面试题),如果是我,我会这么解决:
1,服务端建一个数据库,里面会有2个表,如下:
表1
mySessionID Nvarchar(50) Unique
CheckInDate DateTime
表2
mySessionID Nvarchar(50)
Key Nvarchar(50)
Value Nvarchar(50)
表1的作用的保持确认用户身份的mySessionID(这个命名是为了区别于系统的SessionID)
表2 是存储用户相关数据用的
1, 当客户端第一次访问服务端时,我会通过计算(至于这么计算的不在这里的考虑范围)生成一个mySessionID 给这个Request,并添加到表1中,然后用户保存在服务端的数据会存在表2中
2, 当Response给客户端时,将mySessionID添加到Cookie里返回给客户端,然后下次客户端Request时就可以通过Cookie将自己的mySessionID传到服务端,得到这个mySessionID后,服务端会更新表1中相应的CheckInDate,并可以进行一系列的操作。
3, 至于mySession的过期处理,可以通过一个线程或者一个window服务来每隔20分钟对表1进行清理(如果表一中CheckInDate和当前时间间隔超过20分钟则清理这个用户的数据)
大致的流程差不多就是这样,我想这么做应该是能实现模拟Session的。