1.Session存在server上, asp.net有几种存储方式, 一是inproc, 二是sqlserver, 三是stateserver, 四是可以放到Appfabric Caching中去(这是.net 4.0中新加的).
2.Cookie存在客户端浏览器里, 如果加上expired, 则会保存到客户硬盘上去. 用户可以启用cookie, 也可以关闭cookie, 就这个*, 导致的问题就来了.
3.网站如何识别已登录用户呢?
用户访问网站时, 网站会分配一个sessionID给该浏览器, 这个sessionID存在于客户端的cookie中, 这样, 客户再请求访问网站的其它页面时, 服务器见到这个客户请求, 一检查cookie, 发现有sessionID, 于是就知道谁已登录的用户, 谁是未登录的了.
就是这个样子的:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 22 Jun 2011 09:37:53 GMT
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=zvsoy5xcsvflpdzso40s52se; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 2430
Connection: Close
4.如果客户端禁止使用cookie呢?
cookie不是很安全, 于是就有人禁止关闭它.
这样, 浏览器SessionID无法存入cookie中, 这样, 网站就不能识别用户了, 也就导致所有人都无法登录了, 而这时, 解决办法就是, 修改web.config中cookieless="true", 即可解决某些用户禁用cookie这个问题.
<sessionState cookieless="true" mode="StateServer" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" stateConnectionString="tcpip=127.0.0.1:42424" timeout="30" />
cookieless="true"的官方解释是:如果用户浏览器不支持Cookie时启用会话状态, 看得不是很懂得样子.
不懂没关系, 实践一下, 这时再访问网站, 就会在url中多出一些字符 (如 http://localhost/(S(hbbvecjstz42edqcjobbyh45))/login.aspx) , 这就是把SessionID放Url中了, 不是不让放cookie中吗? 那就只好放url中了, 感觉很丑陋了.
技术上, cookieless的意思就是这样, 但实际上估计没有网站会这么干的, 直接告诉用户起用cookie不就完了, 不启用cookie就别访问我的网站, 爱来不来, 谁怕谁?
下面两篇文章非常好, 推荐一下:
1. Session与Cookie(转)
http://www.blogjava.net/henry1451/articles/209066.html?_sm_byp=iVVHtw6wWV103RW3
里面举的咖啡的例子很好:
一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
第一种情况暂时不考虑.看第二种情况,卡片无疑就是cookie了,所有的数据如果都存在卡片上是不安全的,也是容易遗失的(卡片被修改了?卡片遗失了?这都是有可能的).所以才用了第三种情况.客户除了个会员号再什么信息也没有,这是最安全的,但这个会员号必须是客户自己知道的!也就是cookie中必须存储的.
2. ASP.NET Session Management Internals
http://www.codeproject.com/KB/session/ASPNETSessionInternals.aspx?_sm_byp=iVVHtw6wWV103RW3