HTTP会话保持技术Cookie与Session

引用地址:

https://www.cnblogs.com/zhou7427/p/10087951.html

https://www.cnblogs.com/l199616j/p/11195667.html#_label0

总结:cookie是客户端确认客户身份的方式 缓存在浏览器磁盘,session是服务端确认客户身份的方式存储在服务器(或者redis)

使用方式:客户访问服务器,服务器生成一个sessionId放到cookie中返回给客户端,客户端将此信息缓存本地,再次发起访问请求头中携带此session信息,访问到服务端,服务端判断此sessionId

如下为引用详情:

一、HTTP协议的缺陷——无状态

因为HTTP1.0被设计成是基于TCP协议的短连接,即完成一次“请求-应答”之后会断开连接。所以,服务器接到一次HTTP请求时不知道之前是否曾经收到过同一个客户端发送来的请求,即“无状态”。这意味着如果服务器处理请求时需要上次请求的信息,客户端必须重传全部信息,这样可能导致每次连接传送的数据量巨增。

思考1:为什么HTTP被设计成短连接?能不能是长连接,这样就保存了会话状态?

二、Cookie技术——客户端会话保持

(一)Cookie的原理 

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的属性

Cookie有一些基础属性(参考:rfc2965),其中最重要的是有效期和域名。

1.Cookie的有效期

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);

 2.Cookie的域名

出于对隐私安全的考虑,Cookie设计为不可跨域名。即www.google.com颁发的Cookie不会被提交到域名www.baidu.com,即使提交过去也不可用。

Java实现:

 View Code

 

思考2:能不能利用Cookie文件获得他人权限?

(三)Cookie的应用

1.购物车

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);

2.上次登录时间

Java伪代码:

 View Code

 

3.自动登录

最简单的设计是把用户名密码写入Cookie中,但是有安全隐患,一般存一个hash值。

一个简易的Java实现:

 

 View Code

 三、Session技术——服务器端会话保持

(一)Session的原理 

Session工作原理与Cookie类似,只是Cookie保存在客户端,而Session保存在服务器端,通过Session的唯一标识来区分不同的客户端。工作步骤:

1.客户端向服务器发起请求;

2.服务器端创建Session对象,程序可以操作这个对象,将客户端身份信息等以ke-value形式写入Session。Session对象有一个唯一ID号,例如Tomcat产生的session对象唯一标识是JSESSIONID;

3.服务器端响应报文的报头中会携带Session对象的ID;

4.客户端在以后的请求报头中都会携带Session对象的ID,服务器端根据这个ID号判断客户端身份。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值