转载注明出处:http://www.cnblogs.com/wdfwolf3/。
谢谢。
会话跟踪是Web程序中经常使用的技术,用来跟踪用户的整个会话。经常使用的技术是Cookie与Session。Cookie经过在客户端记录信息肯定用户身份,Session经过在服务器端记录信息肯定用户身份。
1.Cookie
HTTP是一种无状态的协议,服务器单从网络链接上无从知道客户身份。因此给客户端们颁发一个通行证,客户端访问都必须携带本身通行证。这样服务器就能从通行证上确认客户身份了,这就是Cookie的工做原理。
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。
Cookie经常使用属性
属 性 名
|
描 述
|
String name
|
该Cookie的名称。Cookie一旦建立,名称便不可更改
|
Object value
|
该Cookie的值。若是值为Unicode字符,须要为字符编码。若是值为二进制数据,则须要使用BASE64编码
|
int maxAge
|
该Cookie失效的时间,单位秒。若是为正数,则该Cookie在maxAge秒以后失效。若是为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。若是为0,表示删除该Cookie。默认为–1
|
boolean secure
|
该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据以前先将数据加密。默认为false
|
String path
|
该Cookie的使用路径。若是设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序能够访问该Cookie。若是设置为“/”,则本域名下contextPath均可以访问该Cookie。注意最后一个字符必须为“/”
|
String domain
|
能够访问该Cookie的域名。若是设置为“.google.com”,则全部以“google.com”结尾的域名均可以访问该Cookie。注意第一个字符必须为“.”
|
String comment
|
该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
|
int version
|
该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
|
Cookie有效期
Cookie的maxAge属性决定着Cookie的有效期,单位为秒(Second)。若是maxAge为负数,表示临时性,不会被持久化,不会被写到Cookie文件中,该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。若是maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,所以经过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。
Cookie是不可跨域名的
正常状况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,由于两者的域名并不严格相同。若是想全部helloweenvsfei.com名下的二级域名均可以使用该Cookie,须要设置Cookie的domain参数。
Cookie保持登陆状态
一种方案是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。若是不但愿保存密码,还能够把登陆的时间戳保存到Cookie与数据库中,只验证用户名与登陆时间戳就能够。另外一种方案,只在登陆时查询一次数据库,之后访问验证登陆信息时再也不查询数据库,实现方式是把帐号按照必定的规则加密后,连同帐号一块保存到Cookie中。下次访问时只须要判断帐号的加密规则是否正确便可。
2.Session
Session保存在服务器上,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,客户端浏览器再次访问时只须要从该Session中查找该客户的状态就能够了。Session对象是在客户端第一次请求服务器的时候建立的,Session也是一种key-value的属性对,
Session超时时间
为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除,这个时间就是Session的超时时间。若是超过了超时时间没访问过服务器,Session就自动失效了。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。
Tomcat中Session的默认超时时间为20分钟。经过setMaxInactiveInterval(int seconds)修改超时时间。能够修改web.xml改变Session的默认超时时间。例如修改成30分钟:
<session-config>
<session-timeout>30</session-timeout> <!-- 单位:分钟 -->
</session-config>
注意:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。
HttpSession的经常使用方法
方 法 名
|
描 述
|
void setAttribute(String attribute, Object value)
|
设置Session属性。value参数能够为任何Java Object。一般为java Bean。value信息不宜过大
|
String getAttribute(String attribute)
|
返回Session属性
|
Enumeration getAttributeNames()
|
返回Session中存在的属性名
|
void removeAttribute(String attribute)
|
移除Session属性
|
String getId()
|
返回Session的ID。该ID由服务器自动建立,不会重复
|
long getCreationTime()
|
返回Session的建立日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())
|
long getLastAccessedTime()
|
返回Session的最后活跃时间。返回类型为long
|
int getMaxInactiveInterval()
|
返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效
|
void setMaxInactiveInterval(int second)
|
设置Session的超时时间。单位为秒
|
void putValue(String attribute, Object value)
|
不推荐的方法。已经被setAttribute(String attribute, Object Value)替代
|
Object getValue(String attribute)
|
不被推荐的方法。已经被getAttribute(String attr)替代
|
boolean isNew()
|
返回该Session是不是新建立的
|
void invalidate()
|
使该Session失效
|
客户端支持
HTTP协议是无状态的,Session不能依据HTTP链接来判断是否为同一客户,所以服务器向客户端浏览器发送一个名为SESSIONID的Cookie,它的值为该Session的id。Session依据该Cookie来识别是否为同一用户。该Cookie为服务器自动生成的,它的maxAge属性通常为–1,表示仅当前浏览器内有效,而且各浏览器窗口间不共享,关闭浏览器就会失效。所以同一机器的两个浏览器窗口访问服务器时,会生成两个不一样的Session。可是由浏览器窗口内的连接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,所以会共享一个Session。
注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。
客户端不支持Cookie
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器可以解析重写后的URL获取Session的id。这样即便客户端不支持Cookie,也可使用Session来记录用户状态。