面试题 JavaWeb Cookie Session

什么是Cookie?

HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。
Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

什么是 Session?

Session 代表着服务器和客户端一次会话的过程。
Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当客户端关闭会话,或者 Session 超时失效时会话结束。

Cookie 和 Session 的区别?

Cookie

是 web 服务器发送给浏览器的一块信息,浏览器会在本地一个文件中给每个 web 服务器存储 cookie。以后浏览器再给特定的 web 服务器发送请求时,同时会发送所有为该服务器存储的 cookie。

Session

是存储在 web 服务器端的一块信息。session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

区别

①存在的位置

  • cookie 存在于客户端,临时文件夹中;
  • session存在于服务器的内存中,一个session域对象为一个用户浏览器服务

    ②安全性

  • cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放;

  • session存放于服务器的内存中,所以安全性好

    ③网络传输量

  • cookie会传递消息给服务器;

  • session本身存放于服务器,不会有传送流量

    ④生命周期(以30分钟为例)

  • cookie的生命周期是累计的,从创建时,就开始计时,30分钟后,cookie生命周期结束;

  • session的生命周期是间隔的,从创建时,开始计时如在30分钟,没有访问session,那么session生命周期被销毁。但是,如果在30分钟内(如在第29分钟时)访问过session,那么,将重新计算session的生命周期。关机会造成session生命周期的结束,但是对cookie没有影响。

    ⑤访问范围

  • cookie为多个用户浏览器共享;

  • session为一个用户浏览器独享

简单来说cookie机制采用的是在客户端保持状态的方案,
而session机制采用的是在服务器端保持状态的方案。
由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。

如何利用实现自动登录?

当用户在某个网站注册后,就会收到一个唯一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名和密码,就可以访问服务器上的资源。

如何获取Cookie?

1、调用request.getCookie
2、对数组进行循环,调用每个cookie的getName方法

说一下session的机制?

session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识,称为session id;如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。

Cookie的过期和Session的超时有什么区别?

Cookie的过期和Session的超时(过期),都是对某个对象设置一个时间,然后采用轮训机制(或者首次访问时)检查当前对象是否超时(当前对象会保存一个开始时间),如果超时则进行移除。
cookie保存在浏览器中,不安全。而session是保存在服务端的。cookie的生命周期很长,而session很短,一般也就几十分钟。
cookie是保存在客户端,session保存在服务器端,cookie保存着session相关信息。
如果cookie没有超时,那么浏览器每次请求都会带上该cookie信息,服务器端根据cookie信息从session缓存中获取相对应的session。这两个信息有一个超时,用户连接即宣告关闭。
会话的超时由服务器来维护,它不同于Cookie的失效日期。
首先,会话一般基于驻留内存的cookie,不是持续性的cookie,因而也就没有截至日期。
即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去。浏览器会话和服务器会话也会截然不同。

如何解决分布式 Session 问题?

  • Nginx ip_hash策略 ,服务端使用 Nginx 代理,每个请求按访问 IP 的 hash 分配,这样来自同一 IP 固定访问一个后台服务器,避免了在服务器 A 创建 Session,第二次分发到服务器 B 的现象。
  • Session 复制,任何一个服务器上的 Session 发生改变(增删改),该节点会把这个 Session 的所有内容序列化,然后广播给所有其它节点。
  • 共享 Session,服务端无状态话,将用户的 Session 等信息使用缓存中间件来统一管理,保障分发到每一个服务器的响应结果都一致。

    在单点登录中,如果 cookie 被禁用了怎么办?

    单点登录的原理是后端生成一个 session ID,然后设置到 cookie,后面的所有请求浏览器都会带上 cookie,然后服务端从 cookie 里获取 session ID,再查询到用户信息。
    所以,保持登录的关键不是 cookie,而是通过cookie 保存和传输的 session ID,其本质是能获取用户信息的数据。
    除了 cookie,还通常使用 HTTP 请求头来传输。但是这个请求头浏览器不会像 cookie 一样自动携带,需要手工处理。

    session何时被删除?

    session在下列情况下被删除:

  • 程序调用HttpSession.invalidate()

  • 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
  • 服务器进程被停止

    注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。