分类: WINDOWS
2016-02-15 12:21:37
原文地址:SessionId 你到底知道多少? 作者:I_am_tbag
Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来说,我们可以把已登录用户的用户名放在Session中,这样就能通过判断Session中的某个Key来判断用户是否登录,如果登录的话用户名又是多少。
Session对于每一个客户端(或者说浏览器实例)是“人手一份”,用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。那么,ASP.NET 2.0提供了哪些存储SessionID的模式呢:
Cookie(默认)。如果客户端禁止了Cookie的使用,Session也将失效。
URL。Cookie是否开启不影响Session使用,缺点是不能再使用绝对链接了。
ASP.NET 2.0对于Session内容的存储也提供了多种模式。
InProc(默认)。Session存储在IIS进程中(Web服务器内存)。
StateServer。Session存储在独立的Windows服务进程中(可以不是Web服务器)。
SqlServer。Session存储在SqlServer数据库的表中(SqlServer服务器)。
在使用Session的过程中你可能还会遇到很多奇怪的问题,结束本节之前笔者列出了几条常见的FAQ,供大家参考: 为什么每次请求的SessionID都不相同? 可能是没有在Session里面保存任何信息引起的,即程序中任何地方都没有使用Session。只有在Session中保存了内容后,Session才会和浏览器进行关联,此时的SessionID将不会再变化。 为什么当我设置cookieless为true后,在重定向的时候会丢失Session? 当使用cookieless时,你必须使用相对路径替换程序中的绝对路径,如果使用绝对路径,ASP.NET将无法在URL中保存SessionID。 有办法知道应用程序的Session在运行时占用了多少内存吗? 没有办法,你可以通过观察IIS进程(InProc模式)或者aspnet_state进程(StateServer模式)大致估计。 有没有可能知道整个网站使用Session的用户列表? 对于InProc模式和StateServer模式很难,对于SqlServer模式你可以查询存储Session的表进行尝试。 当页面中设了frameset,发现在每个frame中显示页面的SessionID在第一次请求时都不相同,为什么? 原因是你的frameset是放在一个HTML页面上而不是ASPX页面。在一般情况下,如果frameset是aspx页面,当你请求页面时,它首先将请求发送到Web服务器,此时已经获得了SessionID,接着浏览器会分别请求Frame中的其他页面,这样所有页面的SessionID就是一样的,就是FrameSet页面的SessionID。然而如果你使用HTML页面做FrameSet页面,第一个请求将是HTML页面,当该页面从服务器上返回时并没有任何Session产生,接着浏览器会请求Frame里面的页面,这样,这些页面都会产生自己的SessionID,所以在这种情况下就可能出现这种问题。当你重新刷新页面时,SessionID就会一样,并且是最后一个请求页面的SessionID。