Session 和 Cookie 的关系

在 Session 中保存一个变量,用户每请求一次变量增加 1,然后把最新的值以 HTML 的方式返回给客户端。 用户第一次请求,Web 服务器(或者应用服务器,如 Tomcat)返回数字 1,那么 此时 HTTP 传输已经结束,TCP 经历四次挥手,连接关闭。
  1. 当页面再次刷新时(TCP 重新连接,客户端是新的端口)服务器端是如何知道用户对应的 Session 的?
  2. 此时关闭浏览器 Session 是否会释放?
总所周知 HTTP 是无状态的协议,它的状态管理机制是后来增补上去的,被记录在rfc6265(HTTP State Management Mechanism)。具体方法很简单:
  • 服务器端->客户端增加一个新的返回头部“Set-Cookie”,通过它设置一个 Key/Value 结构的数据;客户端负责保存这个数据。
  • 客户端->服务器端增加一个新的请求头部“Cookie”,把保存的 Cookie(Key/Value 结构)提交给服务器端。
这个机制就是 Cookie, Session 机制是建立在 Cookie 机制之上的 。对于 JavaEE 而言:
用户请求的业务逻辑中出现 Session 操作,并且本次请求没有 JSESSIONID 的头部被传递过来,服务器端会通过 Set-Cookie 设置上一个新的
当用户再次请求,Cookie 中包含了 JSESSIONID,服务器端会依据此判断出用户所属的 Session
所以回到开始的两个问题:
  1. 服务器端通过读取 Http 头部 Cookie 部分 JSESSIONID 找到用户所属的 Session
  2. 关闭浏览器只是 JSESSIONID 这个 Cookie 被删除;服务器端的 Session 不会被删除。删除时间是通过 session-timeout 配置的
有一种网络攻击方法叫 Cookie/Session 欺骗,比如某管理员用户登录到系统了,如果我们趁他不在电脑旁边的时候把他的 JSESSIONID 复制走;然后打开浏览器访问相同的网址,通过浏览器设置上 JSESSIONID,再次刷新,你会发现已经登录成功了。也就是说 服务器端其实只认 JSESSIONID,它甚至无法区分究竟有多少管理员“同时在线” 。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值