本文共 2221 字,大约阅读时间需要 7 分钟。
关于Session和Cookie的关系,这里详细分析一些
1.Cookie
Cookie是服务器在本地机器上存储的小段文本,它是一个简单的字符串形式的键值对。 网络服务器用HTTP头向客户端发送cookie, (一般情况下Cookie是由服务端生成的,当然js也能操作cookie) 在客户端,浏览器解析这些cookies并将它们保存到本地, 而后当浏览器访问这个服务器时,它会在任何请求上加上这些cookie。 说白了就是每次你和服务器的交互都会带着这些cookie。2.Cookie 与Session的关系
我们知道session是在服务端的,http又是无状态协议,而seesion又是靠session id来区分的, 因此为了传递session id让服务器识别,这个session id就存放在了cookie中。 (另一种方式是将session id放到url后面,后面我会提到) 因为每次向服务器发送请求时,http头都会带着cookie, 所以服务端就很方便地根据cookie读取出来的session id来区分各个请求的session。比如我现在访问我测试用的servlet,在servlet代码中写上
HttpSession session = request.getSession();这样我就能建立一个session了。
用火狐访问,查看firebug的网络信息,我们可以发现他的响应信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly 这些字样,这说明访问服务器的时候,服务端把seesion id写入到了cookie, 让客户端浏览器把cookie保存起来。到这里我们似乎可以发现些什么,不知道你看到没有?
发送请求的时候带着cookie信息, 从响应信息里我们又看到了让浏览器设置cookie的信息,发送请求 响应
从而我们可以得出,在servlet中,想获得cookie,我们需要从request中取,
下面这段代码就可以在控制台中把客户端过来的cookie信息都打印出来。Cookie[] cs=request.getCookies();
for(int i=0;i<cs.length;i++){ System.out.println(cs[i].getName()); System.out.println(cs[i].getValue()); }而当你想添加cookie时就得往response里添加。Cookie c = new Cookie("mycookie","cookie1234");
c.setMaxAge(3000);//设置cookie有效期, 单位为秒 response.addCookie(c);添加了这个cookie后,你会在刚才控制台的cookie打印中看到你这个mycookie信息。3. 当客户端禁用了Cookie时,如何识别各个session
其实servlet中可以重写url,让他在url后面加上 ;jsessionid=52156A910E95E259B6A2C13CC4DAA916 来识别。 我们可以在servlet中写上response.encodeURL(“test”),这样的话, 当session建立的时候,而客户端不支持cookie,则编码后的url为 test;jsessionid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 若session没有建立,则编码后的url仍旧为test 当然如果session建立,客户端支持cookie的话,那么编码后的url也为test。4.内存Cookie和普通Cookie的区别:
Session的是以cookie或URL重写实现的,默认是cookie来实现的。 系统会创造一个名为JSESSIONID的输出cookie,这种Cookie叫做session cookie, 这个session cookie有区别persistent cookies,也就是我们通常所说的普通的cookie。 特别值得注意的时: session cookie是存储于浏览器内存中的,即所谓的内存cookie,并不是写到硬盘上的, 而普通的cookie则是存在硬盘上的。 我们刚才看到的JSESSIONID就是一个session cookie,我们通常情是看不到JSESSIONID的, 但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递session id, 我们就可以在地址栏看到JSESSIONID=XXXXXXXXXXXXXXXXXXXX之类的字符串了。明白了这个,我们就可以很容易的分辨出persistent cookies和session cookie的区别了。
另外关于两者安全性也就很清楚了: session cookie针对某一次会话而言,会话结束session cookie也就随着消失了; 而persistent cookie只是存在于客户端硬盘上的一段文本, 可以在服务端建立cookie时来设置任意有效期, 而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击, 自然不如session cookie安全了。
转载地址:http://jszmi.baihongyu.com/