现在的位置: 首页 > 综合 > 正文

cookie,session,cache介绍和asp.net中设置网站Session过期的方法

2013年10月05日 ⁄ 综合 ⁄ 共 7576字 ⁄ 字号 评论关闭

一、 中文译名

Ø         Cookie 小饼干? 偶用尽所有的方法都没有找到其中文译名, 就连偶一直非常信任的金山词霸对其也只是一段解释而非译名。(如果哪位高人能译出,请一定要告知金山公司让他们去更新词库)

Ø         Session:会话

Ø         Cache:高速缓冲存储器

 

二、 工作机制

Ø         Cookie:采用的是客户端保存信息的方案。

Ø         Session:采用服务器端保存信息的方案。

Ø         Cache:利用缓存SRAM来“静态”的保存写入信息的方案。

如果上面的“专业”解释你还是不能明白,那我们就来“通俗”的解释它们吧!

 

         1 Cookie客户端的机制就是用户访问站点时,Web服务器发送给该用户的不仅仅是一个页面,还有一个包含日期和时间的 Cookie。用户的浏览器在获得页面的同时还得到了这个 Cookie,并且将它保存在用户硬盘上的某个文件夹中。

Cookie是一段文本信息,你可以在你的电脑硬盘中找到许多这种文件,它们通常存放在C:/Documents and Settings/用户名/Cookies(早于Win2000以前的系统则会存放在c:/windows/Cookies)。

那么Web服务器通过Cookie究竟写下了些什么呢?它们用有什么作用呢?

这些就要看Web服务器的code如何写的了,不过你可以不必担心,服务器在Cookie里写下的信息只是为了你下次访问该站点时节约时间或提供一些特定的服务(绝非病毒或是其它可疑滴东东)。而且某些信息数据是加密的(例如密码等),当然也可以通过设置浏览器让它不记录下Cookie

应用举例:一些要求用户登录的站点则可以通过 Cookie 来确定您是否已经登录过,这样您就不必每次都输入登录信息;一些站点的投票功能可以简单地利用 Cookie 作为布尔值,表示您的浏览器是否已经参与了投票,从而避免您重复投票。

 

2 Session服务端的机制是将用户的请求信息放在服务器端来保存信息,服务器使用一种类似于散列表的结构来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。

这就好像是我们去某些商店去买东西,如果你已是该店的会员,那么商店会给你一张会员卡,下次你再次光顾这家店时只要出示你的会员卡就可以享受订制的服务了。

由于session只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对它的识别产生影响,这时就容易出现了我们常说的session混乱了。

还是以上面会员店为例,如忘带会员卡或是会员卡上的照片已经是你好几年前的样子店员无法辨认,商店会重新给你办理一张会员卡。而此时其实你已经有两张会员卡了(session id)正好这两张卡的服务范围不一样(一张是普通卡,一张是VIP卡),当你再次去商店你任意的给了商店一张卡,这样你得到的服务有可能根本不是你想要的。

当然如果程序写的好是可以避免这种混乱的情况,有时还可以是跨应用程序的session共享。

 

3 Cache“静态”机制跟比起以上两种方式就特殊一些。为什么说它是“静态”,是因为它是有程序写入到SRAM里的,除非是重新写入数据或关闭电源,否则写入的数据是会保持不变的。

由于CPU的存取数据速度比从内存和硬盘中存取数据的速度要快得多,从内存和硬盘中存取数据时会使CPU等待,影响计算机的速度。SRAM的存取速度比其它内存和硬盘都要快,所以它被用作电脑的高速缓存。

有了高速缓存,可以先把数据预写到其中,需要时直接从它读出,这就缩短了CPU的等待时间。高速缓存之所以能提高系统的速度是基于一种统计规律,主板上的控制系统会自动统计内存中哪些数据会被频繁的使用,就把这些数据存在高速缓存中,CPU要访问这些数据时,就会先到Cache中去找,从而提高整体的运行速度。

 

三、 生命周期区别

Ø         Cookie

如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
  如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。有些论坛在你登录时有记住登录信息1个月这类的时间选择,这就是为Cookie设置了过期时间。这时我们就算关闭了浏览器,再次打开访问这个论坛时仍然会是在线状态不需要再次登录。

Ø         Session

Cookie不一样,用户关闭浏览器Session仍然保存在服务器端,只要程序发出指令去删除session,服务器会一直保留这个会话对象直到它处于非活动状态超过设定的间隔为止。

我们有时会误解当用户关闭浏览器时Session已经被删除,是由于大部分session机制都使用cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接到服务器时也就无法找到原来的session

Ø         Cache

由于Cache的机制我们很明显的可以看出,只有关闭电脑电源或是让程序重写Cache。不然这个Cache将会一直存在。

 

.NET Framework 常规参考
sessionState 元素(ASP.NET 设置架构)

 

为当前应用程序配置会话状态设置。

configuration 元素(常规设置架构)
  system.web 元素(ASP.NET 设置架构)
    sessionState 元素(ASP.NET 设置架构)

<sessionState 
    mode="[Off|InProc|StateServer|SQLServer|Custom]"
    timeout="number of minutes"
    cookieName="session identifier cookie name"
    cookieless=
         "[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]"
    regenerateExpiredSessionId="[True|False]"
    sqlConnectionString="sql connection string"
    sqlCommandTimeout="number of seconds"
    allowCustomSqlDatabase="[True|False]"
    useHostingIdentity="[True|False]"
    stateConnectionString="tcpip=server:port"
    stateNetworkTimeout="number of seconds"
    customProvider="custom provider name">
    <providers>...</providers>
</sessionState>

下面几部分描述了属性、子元素和父元素。

属性

属性 说明

allowCustomSqlDatabase

可选的 Boolean 属性。

指定会话状态 SQL 数据库是否可以是自定义数据库(而不是 ASP.NET 默认数据库)。如果为 false,则不能指定初始目录或数据库作为 sqlConnectionString 属性的值。默认会话状态 SQL 数据库为 ASPState 数据库。有关更多信息,请参见会话状态模式

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 false

cookieless

可选的 HttpCookieMode 属性。

指定对于 Web 应用程序使用 Cookie 的方式。

cookieless 属性可以为下列可能值之一。默认值为 UseCookies

说明

AutoDetect

ASP.NET 确定请求浏览器或请求设备是否支持 Cookie。如果请求浏览器或请求设备支持 Cookie,则 AutoDetect 使用 Cookie 来保留用户数据;否则,将在查询字符串中使用一个标识符。如果浏览器或设备支持 Cookie,但当前禁用了 Cookie,则请求功能仍会使用 Cookie。

UseCookies

无论浏览器或设备是否支持 Cookie,都使用 Cookie 来保留用户数据。

UseDeviceProfile

ASP.NET 根据 HttpBrowserCapabilities 设置来确定是否使用 Cookie。如果 HttpBrowserCapabilities 设置指示浏览器或设备支持 Cookie,将使用 Cookie;否则,将在查询字符串中使用一个标识符。

UseUri

无论浏览器或设备是否支持 Cookie,调用功能都使用查询字符串来存储标识符。

cookieName

可选的 String 属性。

指定存储会话标识符的 Cookie 的名称。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 "ASP.NET_SessionId"

customProvider

可选的 String 属性。

指定用于存储和检索会话状态数据的自定义会话状态提供程序的名称。该提供程序在 providers 元素中指定。仅当会话状态模式设置为 Custom 值时,才使用该提供程序。有关更多信息,请参见会话状态模式

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串 ("")。

mode

可选的 SessionStateMode 属性。

指定存储会话状态值的位置。有关更多信息,请参见会话状态模式

mode 属性可以为下列可能值之一。默认值为 InProc

说明

Custom

会话状态将使用自定义数据存储区来存储会话状态信息。

InProc

会话处于正在处理 ASP.NET 辅助进程的状态。

Off

会话状态被禁用。

SQLServer

会话状态将使用进程外 SQL Server 数据库来存储状态信息。

StateServer

会话状态将使用进程外 ASP.NET 状态服务来存储状态信息。

partitionResolverType

可选的 String 属性。

指定在哪里存储会话状态。如果 partitionResolverType 属性中指定了值,则忽略 sqlConnectionStringstateConnectionString 属性。PartitionResolverType 属性返回的连接字符串将用于每个请求,为请求的其余部分连接到适当的服务器位置。如果连接字符串无效,ASP.NET 将引发一个异常,该异常与当配置的服务器连接字符串无效时引发的异常相同。该属性用于在 SQL 或状态服务器模式下在多个后端节点上划分会话状态数据。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为空字符串。

regenerateExpiredSessionId

可选的 Boolean 属性。

指定当客户端指定了过期的会话 ID 时是否重新发出会话 ID。默认情况下,当启用了 regenerateExpiredSessionId 时,仅为 cookieless 模式重新发出会话 ID。有关更多信息,请参见 IsCookieless

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 true

sqlCommandTimeout

可选的 TimeSpan 属性。

指定使用 SQL Server 会话状态模式的 SQL 命令的持续时间超时(秒)。持续时间超时是 SQL 命令可以处于空闲状态的时间(秒),超过此时间之后,该命令将被取消。

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 0:00:30(30 秒)。

sqlConnectionString

可选的 String 属性。

为运行 SQL Server 的计算机指定连接字符串。该属性在 mode 属性设置为 SQLServer 值时是必需的。有关更多信息,请参见会话状态模式

Note注意

若要在使用 SQLServer 模式时提高您的应用程序的安全性,请使用受保护的配置来加密配置的 sessionState 节,以帮助保护 sqlConnectionString 值。

默认值为 "data source=127.0.0.1;Integrated Security=SSPI"

stateConnectionString

可选的 String 属性。

指定远程存储会话状态的服务器名称或地址以及端口。端口值必须为 42424。当 modeStateServer 值时,该属性是必需的。确保运行 ASP.NET 状态服务的服务器是存储会话状态信息的远程服务器。该服务随 ASP.NET 一起安装,默认情况下为 %SystemRoot%/Microsoft.NET/Framework/VersionNumber/aspnet_state.exe。有关更多信息,请参见会话状态模式

Note注意

若要在使用 StateServer 模式时提高您的应用程序的安全性,请使用受保护的配置来加密配置的 <sessionState> 节,以帮助保护 stateConnectionString 值。

默认值为 "tcpip=127.0.0.1:42424"

stateNetworkTimeout

可选的 TimeSpan 属性。

指定 Web 服务器与状态服务器之间的 TCP/IP 网络连接可以处于空闲状态的时间(秒),超过此时间后,请求将被取消。该属性在 mode 属性设置为 StateServer 值时使用。

默认值为 10 秒。

timeout

可选的 TimeSpan 属性。

指定在放弃一个会话前该会话可以处于空闲状态的分钟数。对于进程内和状态服务器模式,timeout 属性不能设置为大于 525,601 分钟(1 年)的值。

会话 timeout 配置设置仅适用于 ASP.NET 页。更改会话 timeout 值不会影响 ASP 页的会话超时时间。同样,更改 ASP 页的会话超时时间不会影响 ASP.NET 页的会话超时时间。

默认值为 20 分钟。

useHostingIdentity

可选的 Boolean 属性。

指定会话状态将恢复为宿主标识还是使用客户端模拟。

如果为 true,ASP.NET 将使用下列进程凭据之一来连接会话状态存储区:

  • 宿主进程;对于 Microsoft Internet 信息服务 [IIS] 5 和 5.1 版为 ASPNET,对于 Microsoft Windows Server 2003 则为 NETWORK SERVICE。

  • 应用程序模拟标识,当使用了以下配置时使用此凭据:

    <identity impersonate="true" userName="user" password="pwd" />

如果为 false,ASP.NET 将使用目前与当前请求的操作系统线程关联的凭据来连接会话状态存储区。对于客户端模拟,ASP.NET 将使用与浏览器协商的安全凭据来连接会话状态存储区。如果为 false,ASP.NET 在连接会话状态存储区时不会恢复为进程标识或应用程序模拟标识。有关更多信息,请参见 ASP.NET 模拟

此属性是 .NET Framework 2.0 版中的新属性。

默认值为 true

Note注意

在 .NET Framework 1.1 版中,如果 mode 属性设置为 SQLServer,并且客户端模拟有效,则 ASP.NET 使用来自 ASP.NET 客户端模拟的客户端凭据连接到运行 SQL Server 的计算机。

继承的属性

可选的属性。

由所有节元素继承的属性。

子元素

元素 说明

providers

包含自定义会话状态存储区提供程序的集合。

父元素

元素 说明

configuration

公共语言运行库和基于 .NET Framework 的应用程序所使用的每个配置文件中均需要的根元素。

system.web

指定配置文件中 ASP.NET 配置设置的根元素,并包含用于配置 ASP.NET Web 应用程序和控制应用程序行为方式的配置元素。

sessionState 元素配置当前应用程序的会话状态设置。

新客户端在开始与 Web 应用程序交互时,会发出一个会话 ID,并且该 ID 将与会话有效期间从同一客户端发出的所有后续请求关联。此 ID 用于在不同的请求中保持与客户端会话关联的服务器端状态。sessionState 元素控制 ASP.NET 应用程序如何为每个客户端建立并保持这种关联。

这种机制非常灵活,可以为您提供许多功能,其中包括承载进程外的会话状态信息,以及在不使用 Cookie 的情况下跟踪状态。

在 URI 中发送会话 ID 时,可以超过 URI 的最大大小。如果匿名标识票证、Forms 身份验证票证、会话 ID 和用户数据的组合超过了允许的最大 URI 长度,请求将失败,并发出“400 错误的请求”错误。

使用 StateServer 模式

  1. 在将要存储会话状态信息的远程服务器上,确保 ASP.NET 状态服务正在运行。

    ASP.NET 状态服务是随 ASP.NET 一起安装的,默认情况下为 %SystemRoot%/Microsoft.NET/Framework/version/aspnet_state.exe。

  2. 在应用程序的 Web.config 文件中,将 mode 设置为 "StateServer",并将 stateConnectionString 设置为诸如 "tcpip=dataserver:42424" 这样的值。

使用 SQLServer 模式

  1. 在运行将要存储会话状态的 SQL Server 的计算机上运行 InstallSqlState.sql。

    默认情况下,InstallSqlState.sql 位于 %SystemRoot%/Microsoft.NET/Framework/version 中。

    这将创建一个具有新存储过程的名为 ASPState 的数据库,并在 TempDB 数据库中创建名为 ASPStateTempApplications 和 ASPStateTempSessions 的表。

  2. 在应用程序的 Web.config 文件中,将 mode 设置为 "SQLServer",并将 sqlConnectionString 设置为诸如 "data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind" 这样的值。

抱歉!评论已关闭.