说实话,关于Cookie,看上去相当简单的一个技术。手册上是这么说的:一小段信息,存在浏览器上的一小段标记信息。Cookie的主体是一个键值对构成,键值对都是字符串形式的。Cookie由服务端创建,不是浏览器自己创建的,服务端创建后发给浏览器。而浏览器在访问服务器时,在一定情况下会再次带给服务器。这样传递浏览器上的信息。浏览器和服务端中便形成了一定的私下通信。
打个比方,就像虚竹他妈(服务器) 在他背上留了戒点印记。后来他妈就认出虚竹(浏览器)来了。
通过上面的描述,Cookie的原理很形象了。
Java中的Cookie:
看似很简单,用起来很费劲,这是我这几天使用的感受。
注意一:服务器添加Cookie时,一定要指定Path.
如果不指定path,浏览器虽然不会把这个Cookie无视掉,但是它会查看需要访问的URL,没有Path的Cookie和你本身的URL不匹配,就不会再带这个Cookie到Http请求中。最后你给浏览器的Cookie就回不来了。
Cookie cookie= new Cookie("time", "time");
cookie.setMaxAge(60*60*24);
cookie.setPath(request.getContextPath());//必须的
response.addCookie(cookie);
注意二:今天遇到比较坑的事。
你再次从浏览器获得Cookie时,调用Cookie对象的public intgetMaxAge()方法,返回始终为-1.API上是下面这样说的:
Returns the maximum age of the cookie, specified in seconds, By default,-1
indicating the cookie will persist until browser shutdown.
返回Cookie的最大期限,单位是秒。返回-1则表示,Cookie有效期直到关闭浏览器为止。这不是坑吗?我设置了足够长的时间,下次返回依然是-1。
Cookie [] cookies= request.getCookies();
for(Cookie co:cookies){
if("time".equals(co.getName()))
System.out.println(co.getMaxAge());//再次获取时,始终为-1
注意三:没有删除Cookie的方法。只有覆盖原来的Cookie,再将Cookie的最大期限设置为0或以下。
Cookie cookie= new Cookie("time", "time");
cookie.setMaxAge(0); //干掉Cookie的关键是1.时间
cookie.setPath(request.getContextPath());//2.path要与想干掉的Cookie对象的paht一致。
response.addCookie(cookie);
总结:Cookie对象由名字和path唯一确定这个Cookie对象。