Session与Cookie

cookie技术

http协议是无状态的,服务器无法判断某一个简单http请求来自于谁。这里我们可以利用cookie技术,当一个用户第一次登录服务器时,http request中不带有cookie字段,服务器通过http response中set-cookie字段设置浏览器访问该网站的cookie,然后该用户第二次访问服务器时,由于服务器设置了cookie,浏览器会自动将关联该服务器的cookie中的内容添加在http request请求头中一并发给服务器,这时服务器通过cookie的内容就知道了这个请求来自于该用户。

cookie本质上是一些键值对组成的表,它还包括了过期时间,路径和域。

session技术

服务器虽然可以简单的通过cookie技术识别用户,但是cookie本身安全性不好,容易被其他人读取。session技术是在服务端保存用户信息,而再向用户浏览器set-cookie时,设置一个sessionId,再次访问服务器时,通过sessionId来识别用户。

session与cookie的关系

两者都用于解决http协议无状态的问题,cookie基于客户端,session基于服务端,同时session依赖于cookie。因此,当浏览器禁用cookie的时候,session也将随之失效。

session与cookie的生命周期

  • cookie在服务端返回http响应时可以设置有效时间,cookie在该时间范围内有效,过期即失效。cookie会持久化在硬盘上,即使浏览器关闭也可以再次读取,直至失效。
  • 服务端返回时未设置有效时间,则cookie在浏览器关闭后即失效。
session
  • 创建:在服务端调用HttpServletRequest.getSession(true)时为该用户创建session(ps:java服务端)
  • 有效期:默认有效期30分钟,可以自行调整。
  • 失效:1、session超时失效。2、调用invalidate()方法。3、服务器关闭或重启,这里如果session做了持久化,服务器重启之后依然可以从持久化的记录中重建session。

session原理简述(tomcat)

这是tomcat下session包源码结构:
这里写图片描述
session本身是一个接口,是servlet中HttpSession接口的外观模式,阅读session的标准实现类StandardSession源码,我们可以发现本质上其通过ConcurrentHashMap来保存存在其中的各属性值,记录了创建时间和上次访问时间用于表征生命周期状态等
这里写图片描述

对于整个web服务器来说,需要一个session容器来对session进行管理,这个容器对应的接口就是Manager接口,其抽象实现类ManagerBase中实现了对session生命周期的管理(创建、计时、销毁),其容器也是ConcurrentHashMap,其key值通常为jsessionId
这里写图片描述

负载均衡下session共享问题

  • session保持:通过session保持,LB进行请求转发的时候保证每个客户端固定地访问到集群的同一台服务器。显然,session保持并不能保证真正的负载均衡
  • session复制:将每台服务器上的session信息复制给其他服务器,使得每台服务器都有一份session信息
  • session共享:将session信息放在统一的地方统一访问,将session信息放在redis或Memcached这类KV数据库里

cookie禁用问题

可以用时URL重写,将sessionId附在url之后

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值