说说 Session 和 Cookie 有什么联系和区别?

先来看看什么是 Session 和 Cookie :

  • Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个 Cookie,客户端就把 Cookie 保存起来。在客户端下次向同一服务器再发起请求时,Cookie 被携带发送到服务器。服务端可以根据这个 Cookie 判断用户的身份和状态。
  • Session 指的就是服务器和客户端一次会话的过程。它是另一种记录客户状态的机制。不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。客户端浏览器再次访问时只需要从该 session 中查找用户的状态。

weixin-mianznxjsjwllsewswztwxxssc-bea711c9-2f1c-42ed-a05d-5e17bf868fa6.png

Session 和 Cookie, 有什么不同呢?

以下是 Session 和 Cookie 的不同之处:

  • 存储位置:Cookie 存储在客户端,而 Session 存储在服务器端。
  • 数据类型:Cookie 只能存储 ASCII 数据,而 Session 可以存储任意类型的数据。通常情况下,我们可以在 Session 中保存一些常用的变量信息,比如 UserId 等。
  • 有效期:Cookie 可以设置为长期保存,例如常见的默认登录功能,而 Session 通常具有较短的有效时间,客户端关闭或 Session 超时后会失效。
  • 隐私策略:由于存储在客户端,Cookie 更容易受到非法获取的风险。在早期,有些人将用户的登录名和密码存储在 Cookie 中,导致信息被窃取。而 Session 存储在服务器端,相对于 Cookie 具有更好的安全性。
  • 存储大小:单个 Cookie 可以存储的数据大小不能超过 4KB,而 Session 可以存储远大于 Cookie 的数据量。

Session 和 Cookie 之间有什么关联呢?

可以使用 Cookie 来记录 Session 的标识。

  • 当用户首次向服务器发起请求时,服务器根据用户提交的信息创建相应的 Session,并在返回的响应中将该 Session 的唯一标识 SessionID 返回给浏览器。浏览器接收到服务器返回的 SessionID 信息后,将其存储在 Cookie 中,并记录该 Cookie 属于哪个域名。
  • 当用户再次访问服务器时,请求会自动检查是否存在与该域名相关的 Cookie 信息。如果存在 Cookie,浏览器会自动将 Cookie 信息发送给服务器。服务器根据 Cookie 中的 SessionID 获取相应的 Session 信息。如果找不到 Session,说明用户未登录或登录已失效;如果找到 Session,表示用户已登录,可以执行后续操作。

在分布式环境中,如何处理 Session?

在分布式环境中,客户端请求经过负载均衡可能会分配到不同的服务器上,如果一个用户的请求没有落到同一台服务器上,那么在新的服务器上将无法找到该用户状态的 Session。

针对这个问题,可以使用 Redis 等分布式缓存来存储 Session,以实现多台服务器之间的共享。

如果客户端无法使用 Cookie,应该如何处理 SessionID 的存储和传递?

在某些情况下,客户端无法使用 Cookie,例如浏览器禁用了 Cookie,或者客户端是安卓、iOS 等移动应用。

针对这种情况,可以考虑以下方式来存储 SessionID 并进行传递:

  • 存储方式:可以使用客户端的本地存储,例如浏览器的

sessionStorage。

  • 传递方式:

    • 拼接到 URL 中:直接将 SessionID 作为 URL 的请求参数拼接在后面。
    • 放入请求头中:将 SessionID 放入请求的头部,作为请求的一个字段。这是比较常用的方式。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题, 计算机网络, 计算机网络面试题