session和cookie简介

转载注明出处: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来记录用户状态。
posted @ 2017-09-04 13:04  wdfwolf3  阅读(204)  评论(0编辑  收藏  举报