其实这篇文章是1年多前整理和总结的,比较基础,但有时确实忘记了需要查看一下,留个备份。
Session,cookie是b/s中最常见的元素,除了只支持wap1.0的手机,部分不支持cookie,因此session客户端也一般存到url上,或者客户端禁止cookie,但现在一般不手工禁止cookie。下面对它们的区别做个简单的介绍,这里涉及具体配置就用.net环境下的配置介绍,不同语言思想都一样。
下面简单介绍Http协议和Session,Cookie介绍和简单区别:
Http协议:
服务端不能主动连接客户端,只能被动等待并答复客户端请求,浏览器无法记录客户端上次请求的状态(Request Header | Response Header)。
Session:
Session对象的原理:服务器为客户端创建并维护一个Session对象,用于存放数据。在创建Session对象的同时,服务器为该Session对象产生一个唯一编号SessionID。
服务器保存方式: ( mode )
Off:禁用。
InProc:设置为将Session存储在进程内,默认设置, 性能最高。
StateServer: 将Session存储在独立的状态服务中,通常是aspnet_state.exe进程,性能损失10-15%。
SQLServer: 设置将Session存储在SQL Server中,性能损失10-20%。
Customer: 自定制的存储方案 由实现方式确定。
下面详细介绍StateServer和SQLServer配置方式。
StateServer:1.启动 Asp.net State service服务.(这个服务默认的状态为手动.修改为自动并启动.)2.修改注册表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters]
设置 AllowRemoteConnection = 1 , 设置 Port = 42424 (十进制,默认即为42424)
Port是服务的端口号
AllowRemoteConnection 表示是否允许其他机器连接,0为仅能本机使用,1为可以供其他机器使用.
如:<sessionstate timeout="30" cookieless="AutoDetect" stateconnectionstring="tcpip=127.0.0.1:42424" mode="StateServer" />
即可。
SqlServer: 使用SqlServer模式搭建Session服务器端有两种方式. ASP.NET 1.0和1.1版本请使用方式a, 2.0即以上版本请使用方式b.
a.使用SQL文件创建Session数据库
在ASP.NET 1.0和1.1 版本中, 只能使用这种方式.对于2.0及其以上版本,请使用aspnet_regsql.exe工具.(当然此方法也通用2.0版本)
.net提供了数据库安装脚本,可以在机器的windows文件夹中找到:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlState.sql
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlStateTemplate.sql
根据ASP.NET的版本不同, 需要使用不同的SQL脚本. ASP.NET主要有1.1和2.0两个版本,可以在不同的版本文件夹找到这两个SQL.
InstallSqlState.sql 是创建默认名称的数据库"[ASPState]".此SQL可以直接运行.
InstallSqlStateTemplate.sql 可以使用自己指定的数据库保存数据.此SQL需要自己修改后运行, 打开SQL文件将其中 [DatabaseNamePlaceHolder] 替换为自己指定的数据库名称.
执行installsqlstate.sql时不需要指定数据库,可以在任意数据库上执行.此SQL会自己创建新的数据库。
b. 使用aspnet_regsql.exe工具
ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的"系统根目录\Microsoft.NET\Framework\版本号"文件夹中.
使用举例: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -ssadd -E 运行这个新OK了
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -S . -U sa -P liusen -ssadd -sstype p 这个可远程开启
例如:
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S . -U sa -P liusen -ssadd -sstype c -d chens(自定数据库)
-S参数:
表示数据库实例名称. 可以用"."表示本机.
-U和-P参数:
表示用户名和密码.
-E参数:
可以再-U –P 与 -E中选择一组. –E表示以当前系统用户通过windows身份验证登录数据库, -U -P则是使用SqlServer用户登录数据库.
-ssadd / –ssremove 参数:
-ssadd表示是添加Session数据库, -ssremove表示移除Session数据库.
sstype 参数: t 将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。 p 将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。 c 将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。
注意:在SQLServer模式下,session过期是由SQL Agent使用一个注册任务完成的,要确认SQL Agent已经运行。否则无法清理过期的Session数据, 会导致数据库数据一直增加。
http请求的相关数据,sessionid在客户端默认也是以httponly的cookie方式存储:
Cookie:
Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递大多数浏览器支持最大为 4096 字节的 Cookie 大多数浏览器只允许每个站点存储 20 个 Cookie(IE6),FF,IE7可以存20个以上
1.decryption:该属性用于说明对数据进行解密算法,属性值可以为Auto、AES或3DES。属性值为Auto时,由asp.net的配置的默认值来确定解密算法,该值为默认值。属性值为AES时,使用AES算法,AES为数据解密的默认算法。属性值为3DES时,使用3DES算法。
2.validation:该属性用于指定对数据进行验证的算法,属性值可以为AES、MD5、SHA1、TripleDES,默认值为SHA1。
3.decryptionKey:该属性用于指定对数据进行加解密的密钥,也可以用于指定生成该密钥的进程。如果validation的属性值为TripleDES,该属性则可以用于对Forms身份验证的加解密,也可以用于视图状态的加密。该属性值可以为AutoGenerate或value。如果属性值为AutoGenerate,则说明asp.net生成随机的密钥,并存放在LSA中,该值是默认值。如果属性值为value,则指定一个手动分配的密钥,该密钥必须是十六进制的字符串。在使用DES加密时,密钥的长度必须是16位,使用3DES加密时,密钥长度必须是48位,只有使用128位加密的情况下,才能使用3DES。另外,decryptionKey属性值中可以添加IsolateApps修饰符,该修饰符可以让asp.net将每个应用程序的ID为每个应用程序生成一个唯一的密钥。该属性的默认值为“AutoGenerate,IsolateApps” 。
4.validationKey: 该属性用于指定对数据进行验证的密钥。
对于页面嵌套另外的域的iframe等第三方cookie,IE浏览器可能存在子页面设置的cookie,父页面无法获取。需要设置Iframe –P3P
HttpContext.Current.Response.AddHeader("P3P", "CP=CAO PSA OUR");
区别总结:
1、Session 可以以Cookie的形式存在客户端,也可以用URL传输SessionID,如果是Cookie形式,则它是服务器端设置的H
ttpOnly的Cookie,在客户端它只是一个ID,只有关联服务器,才知道它的具体值。
2、Cookie是客户端和服务器端传输的小文本,它存了对应的具体指,服务器不用为每个具体Cookie存对应关系的值。