引用地址:
https://www.cnblogs.com/zhou7427/p/10087951.html
https://www.cnblogs.com/l199616j/p/11195667.html#_label0
总结:cookie是客户端确认客户身份的方式 缓存在浏览器磁盘,session是服务端确认客户身份的方式存储在服务器(或者redis)
使用方式:客户访问服务器,服务器生成一个sessionId放到cookie中返回给客户端,客户端将此信息缓存本地,再次发起访问请求头中携带此session信息,访问到服务端,服务端判断此sessionId
如下为引用详情:
因为HTTP1.0被设计成是基于TCP协议的短连接,即完成一次“请求-应答”之后会断开连接。所以,服务器接到一次HTTP请求时不知道之前是否曾经收到过同一个客户端发送来的请求,即“无状态”。这意味着如果服务器处理请求时需要上次请求的信息,客户端必须重传全部信息,这样可能导致每次连接传送的数据量巨增。
思考1:为什么HTTP被设计成短连接?能不能是长连接,这样就保存了会话状态?
Cookie是通过HTTP协议扩展实现的,即在HTTP请求头里面增加Cookie字段,用于存储客户端信息。
Cookie的原理和实现步骤参考图1:
图1:Cookie实现会话保持步骤截图
1.客户端向Web服务器发起HTTP请求;
2.服务器在返回响应时,在HTTP响应头中设置Set-Cookie字段,该字段存储客户端信息和状态;
Java实现:
Cookie cookie = new Cookie("username","zhang3");
response.addCookie(cookie);
3.客户端解析服务器HTTP响应报头中的Set-Cookie字段,并根据其生命周期创建不同类型的Cookie(例如持久化Cookie就会在客户端硬盘上创建Cookie文件)。之后客户端每次发送HTTP请求报文时,都会在请求报头中增加Cookie字段。
4.服务器接收客户端的HTTP请求之后,从报文头中取出Cookie数据,来校验客户端状态或身份信息。
Cookie有一些基础属性(参考:rfc2965),其中最重要的是有效期和域名。
Cookie的有效期有两个属性可以设置,Expires或Max-Age。Expires规定Cookie在一个具体的时刻失效;Max-Age指定从创建Cookie开始,到Max-Age秒之后失效。这些Cookie会在客户端由浏览器持久化到磁盘上(win7位置:C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Cookies。参考图2)。如果不显示设置有效期,Cookie会在连接断开后失效。
图2:windows7中保存的Cookie文件截图
Java实现:
Cookie cookie = new Cookie("username","zhang3");
cookie.setMaxAge(30*24*60*60);//单位秒;-1为临时;0删除cookie
response.addCookie(cookie);
出于对隐私安全的考虑,Cookie设计为不可跨域名。即www.google.com颁发的Cookie不会被提交到域名www.baidu.com,即使提交过去也不可用。
Java实现:
View Code
思考2:能不能利用Cookie文件获得他人权限?
1) 服务器遍历用户选择的商品
2) 将商品放入集合类
3) 将集合存入Cookie
Java伪代码:
for(Good good:goodSelected){
goodList.put(good.name+"-"+good.price+"-"+good.num)
}
cartCookie = new Cookie("cart",goodList);
response.addCookie(cartCookie);
Java伪代码:
View Code
最简单的设计是把用户名密码写入Cookie中,但是有安全隐患,一般存一个hash值。
一个简易的Java实现:
View Code
Session工作原理与Cookie类似,只是Cookie保存在客户端,而Session保存在服务器端,通过Session的唯一标识来区分不同的客户端。工作步骤:
1.客户端向服务器发起请求;
2.服务器端创建Session对象,程序可以操作这个对象,将客户端身份信息等以ke-value形式写入Session。Session对象有一个唯一ID号,例如Tomcat产生的session对象唯一标识是JSESSIONID;
3.服务器端响应报文的报头中会携带Session对象的ID;
4.客户端在以后的请求报头中都会携带Session对象的ID,服务器端根据这个ID号判断客户端身份。