Java面试题汇总之JavaWeb(session 和 cookie)

一、session 和 cookie的工作原理和区别

原文链接:https://blog.csdn.net/liyifan687/article/details/80077928

前言

HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。

应用场景

登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。

1.Cookie

通俗讲,是访问某些网站后在本地存储的一些网站相关信息,下次访问时减少一些步骤。更准确的说法是:Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器,是在客户端保持状态的方案。
Cookie的主要内容包括:名字,值,过期时间,路径和域。使用Fiddler抓包就可以看见,比方说我们打开的某个网站可以看到Headers包括Cookie,如下: 

BIDUPSID: 9D2194F1CB8D1E56272947F6B0E5D47E 
PSTM: 1472480791 
BAIDUID: 3C64D3C3F1753134D13C33AFD2B38367:FG 
ispeed_lsm: 2 
MCITY: -131: 
pgv_pvi: 3797581824 
pgv_si: s9468756992 
BDUSS: JhNXVoQmhPYTVENEdIUnQ5S05xcHZMMVY5QzFRNVh5SzZoV0xMVDR6RzV-bEJZSVFBQUFBJCQAAAAAAAAAAAEAAACteXsbYnRfY2hpbGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALlxKVi5cSlYZj 
BD_HOME: 1 
H_PS_PSSID: 1423_21080_17001_21454_21408_21530_21377_21525_21193_21340 
BD_UPN: 123253 
sug: 3 
sugstore: 0 
ORIGIN: 0 
bdime: 0

key, value形式。过期时间可设置的,如不设,则浏览器关掉就消失了,存储在内存当中。否则就按设置的时间来存储在硬盘上的,过期后自动清除。比方说开关机关闭再打开浏览器后他都会还存在,前者称之为Session cookie 又叫 transient cookie,后者称之为Persistent cookie 又叫 permenent cookie。路径和域就是对应的域名,a网站的cookie自然不能给b网站用。

2.Session

  • 存在服务器的一种用来存放用户数据的类 HashTable 结构。
  • 浏览器第一次发送请求时,服务器自动生成了一个 HashTable 和一个 Session ID 来唯一标识这个 HashTable,并将其通过响应发送到浏览器。浏览器第二次发送请求会将前一次服务器响应中的 Session ID 放在请求中一并发送到服务器上,服务器从请求中提取出Session ID,并和保存的所有 Session ID 进行对比,找到这个用户对应的 HashTable。 
  • 一般这个值会有个时间限制,超时后毁掉这个值,默认30分钟。
  • 当用户在应用程序的 Web页间跳转时,存储在 Session 对象中的变量不会丢失而是在整个用户会话中一直存在下去。
  • Session的实现方式和Cookie有一定关系。建立一个连接(打开几个页面就好几个了)就生成一个session id,这里就用到了Cookie,再次请求页面时,把session id存在Cookie中,每次访问的时候将Session id带过去就可以识别了。

3.区别

  • 存储数据量方面:session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
  • Cookie和Session都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。因Cookie在客户端所以可以编辑伪造,所以不是十分安全。
  • Cookie有大小限制以及浏览器在存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。Session过多时会消耗服务器资源,大型网站会有专门Session服务器,Cookie存在客户端不会出现该问题。
  • 域的支持范围不一样,比方说a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解决这个问题的办法是JSONP或者跨域资源共享。

session多服务器间共享

  • 服务器实现的 session 复制或 session 共享,如 webSphere或 JBOSS 在搭集群时配置实现 session 复制或 session 共享.致命缺点:不好扩展和移植。
  • 利用成熟技术做session复制,如12306使用的gemfire,如常见内存数据库redis或memorycache,虽较普适但依赖第三方。
  • 将 session维护在客户端,利用 cookie,但客户端存在风险数据不安全,且可以存放的数据量较小,所以将session 维护在客户端还要对 session 中的信息加密。
  • 第二种方案和第三种方案的合体,可用gemfire实现 session 复制共享,还可将session 维护在 redis中实现 session 共享,同时可将 session 维护在客户端的cookie 中,但前提是数据要加密。

这三种方式可迅速切换,而不影响应用正常执行。在实践中,首选 gemfire 或者 redis 作为 session 共享的载体,一旦 session 不稳定出现问题的时候,可以紧急切换 cookie 维护 session 作为备用,不影响应用提供服务。

单点登录中,cookie 被禁用了怎么办?(一点登陆,子网站其他系统不用再登陆)

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

三、如果客户端禁止 cookie 那么 session 还能用吗?

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值