共计 2927 个字符,预计需要花费 8 分钟才能阅读完成。
开篇介绍
大家好,我是 Java 最全面试题库
的提裤姐
,明天这篇是 JavaWeb 系列的第三篇,次要总结了 Java 中的 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 对象生效。