【022】JavaWeb⾯试题(三):Cookie和Session
开篇介绍
⼤家好,我是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机制采⽤的是在客户端保持状态的⽅案,
jsessionid⽽session机制采⽤的是在服务器端保持状态的⽅案。
由于才服务器端保持状态的⽅案在客户端也需要保存⼀个标识,所以session机制可能需要借助于cookie机制来达到保存标识的⽬的。
如何利⽤实现⾃动登录?
当⽤户在某个⽹站注册后,就会收到⼀个唯⼀⽤户ID的cookie。客户后来重新连接时,这个⽤户ID会⾃动返回,服务器对它进⾏检查,确定它是否为注册⽤户且选择了⾃动登录,从⽽使⽤户务需给出明确的⽤户名和密码,就可以访问服务器上的资源。
如何获取Cookie?
1、调⽤Cookie
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对象失效。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。