cookie与session
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie与session相关的知识,希望对你有一定的参考价值。
Cookie
会话(Session)跟踪是web程序中常见的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1.Cookie机制
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据需要建立新
的链接。服务器识别不出来是否与客户端创建过链接。这就意味着服务器无法从连接上跟踪会话。Cookie这种
机制可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?
给客户端们颁发一个通行证,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证
上确认客户身份了。这就是Cookie的工作原理。
Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用respo
nse向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再次请求该网站时,
浏览器会把请求的网址连同Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户的状态。
服务器还可以根据需要修改Cookie的内容。
2.服务器获取Cookie和设置Cookie
获取:request。getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回)
设置:response.addCookie(Cookie cookie)向客户端设置Cookie
3.Cookie的不可跨域名性
Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。
4.Unicode编码 保存中文 中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字符
BASE64编码 保存二进制图片
5.Cookie中的属性
int maxAge 该Cookie失效的时间。单位秒。如果为正数,则该Cookie在MaxAge秒之后失效。如果为负数
该Cookie为临时的Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示
删除该Cookie。默认为-1.下面的代码中的Cookie信息将永远有效
Cookie cookie=new Cookie("username","helloweenvsfei"); //新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); //设置生命周期为MAX_VALUE
response.addCookie(cookie); //输出到客户端
删除Cookie
Cookie cookie=new Cookie("username","helloweenvsfei"); //新建Cookie
cookie.setMaxAge(0)/设置生命周期为MAX_VALUE
response.addCookie(cookie); //输出到客户端
Cookie不提供修改
要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。
Session
Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单,增加了服务器的存储压力
1 Session是另一种记录用户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客
户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,就是Session。
客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过
检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案
,客户来访的时候只需要查询客户档案表就可以了。
Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。
2.Session的生命周期
Session保存在服务器端,为了获得更高的存取速度,服务器一般把session放在内存中。每个用户都会有一个
独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session
里的信息应该尽量精简
Session在用户第一次访问服务器的时候自动创建。需要注意的是只有访问JSP。Sevlet等程序时才会创建
Session,只访问html,IMAGE等静态资源并不会创建Session。如果尚未生成Session。也可以使用
request.getSession(true)强制生成Session
Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护Session。用户每访问
服务器一次,无论是否读写Session,服务器都认为该用户的Session活跃了一次
3.Session的有效期
由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。
Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。
Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。
4.如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写
缺点
对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。
这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。
另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
缺点:
仅当每个页面都是有表单提交而动态生成时,才能使用这种方法。单击常规的<A HREF..>超文本链接并不产生表单提交,因此隐藏的表单域只能用于一系列特定的操作中,比如在线商店的结账过程。
以上是关于cookie与session的主要内容,如果未能解决你的问题,请参考以下文章
[TimLinux] HTTP cookie与session技术