【022】JavaWeb面试题(三):Cookie和Session

开篇介绍

你们好,我是Java最全面试题库提裤姐,今天这篇是JavaWeb系列的第三篇,主要总结了Java中的Cookie和Session相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,作到日更!若是我能作到百日百更,但愿你也能够跟着百日百刷,一百天养成一个好习惯。web

什么是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机制来达到保存标识的目的。cookie

如何利用实现自动登陆?

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

如何获取Cookie?

一、调用request.getCookie
二、对数组进行循环,调用每一个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对象失效。
相关文章
相关标签/搜索