最近看到了 一篇关于cookie和session的文章,写的非常详细全面,受益匪浅。写一下从中学到了些什么吧!
首先我们知道cookie和session是用来跟踪会话的,因为http协议是无状态的,也就是说服务器和浏览器一旦结束会话,再次交换数据时就会创建新的会话。就像是A买了一件东西放入购物车,当A又买了一样东西,服务器就不知道这件东西是属于A还是属于其他用户了。所有为了弥补http的无状态的缺陷,就产生了cookie和session。可以通过采用cookie将信息保留在客户端解决,或者用session把信息保留在服务器解决。
Cookie:
1. cookie是存在于客户端的。既然服务器不能判断客户身份,就给每个客户发一个通行证吧,你来访问我的时候就带着你的通行证,我一看你的通行证信息就知道是谁访问的我了。比如说:发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。 【卡上记录所有信息,而店家只认卡不认人。】一般用于设置免登录操作
客户端请求服务器的时候,服务器会通过response给客户端添加一个cookie,客户端就会保存起来这一段文本信息,在以后访问的时候带着这个cookie,让服务器识别出自己。
还知道了一个有意思的tips:在浏览器地址栏输入:javascript:alert(document.cookie),就会显示这个网站给你颁发的cookie内容。以前不知道,孤陋寡闻了 :)
2.Cookie的不可跨域名性
很多网站都有cookie,那他们怎么区别是哪个网站的呢?也就说能不能跨网站对cookie进行操作呢?
肯定是不能的,cookie具有不可跨域名性,我们不能拿着谷歌的cookie访问百度,也不能拿着百度的访问谷歌,因为他们的域名不一样。需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,他确实可以访问的。因为可以通过设置cookie的一个属性:String domain 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.” cookie.setDomain(".google.com");
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规范 |
其他属性的详解我就不说了,大家可以去看原博。
Session
1.session是存在服务器端的,客户端访问服务器的时候,服务端把客户端信息记录在服务器上,客户端再次访问的时候,服务器就从该session获取客户信息就可以了。比如:发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 【只记用户ID,而ID的详细记录放在店家的数据库里;每次凭ID检索服务器的记录。这个id就是sessionID】
2.Session机制原理
1)首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象
2)每个session都有一个sessionid
3)将sessionid保存在客户端的Cookie中
4)后续每次请求request都携带cookie到服务器端
5)服务器端根据客户端的sessionid判断属于哪个会话
3.Session的生命周期
当第一次访问jsp,servlet等程序是才会创建session,HTML,imgs等静态资源是不会创建的。session生成后,只要用户继续访问,服务器就会更新最后访问时间,无论session是否发生读写,服务器都认为session 活跃了一次。为了防止内存溢出(session存在内存里),服务器会清理一定时间内没有活跃的session,这个时间就是session的maxInactiveInterval。超过这个时间,session就过期了。或者调用invalidate()方法也会 让session失效。关闭浏览器不会使session消失。
4.session常用方法
方 法 名 | 描 述 |
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失效 |
Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。可以修改web.xml改变Session的默认超时时间。例如修改为60分钟:
<session-config>
<session-timeout>60</session-timeout> <!-- 单位:分钟 -->
</session-config>
3.session与cookie的区别
1)cookie数据存放在客户端,session数据放在服务器上(sessionid可以通过cookie保存在客户端,也可以使用URL重写方式)
2)cookie不是很安全(可以加密),别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
5)Cookie的数据都以字符串的形式保存。Session中可以保存对象信息。
写的不够详细,原博中有更详细的说明,大家可以去看:
http://www.cnblogs.com/linguoguo/p/5106618.html