一、问题

cookie和session的区别?

二、回答

1、总结如下
- cookie:
  - cookie存储于客户端本地,即浏览器缓存
  - cookie存储着sessionId,作为后台session缓存的主键,可以快速识别用户身份,减少后台请求
  - 问题:数据量较小,不适合存储大数据,如有些图片很大就支撑不了
  - 问题:有些服务器禁用cookie,就无法使用cookie
  - 替代方案:采用HTML5的Session Storage,支持较大的数据存储

- session:
  - session存储于服务器端,即web服务器缓存
  - session存储着登录后用户的基本信息,以减轻数据库服务器的压力
  - session后台有设置缓存失效时间,长时间不登录,后台会清除session缓存
  - 服务器重启会导致session缓存数据丢失
  - 问题:集群数据共享问题,如web1存用户基本信息,web2下单,从web2中无法获取到web1的用户信息
  - 替代方案1:使用Redis替代session,实现分布式缓存
  - 替代方案2:不使用缓存,将信息写在HTTP协议里,使用token

2、cookie与session交互示意图

如上图,当客户端用户在www.xxx.com网址下输入用户名密码,登录成功,服务器端会为admin这个用户创建一份session缓存空间,存储admin用户的基本用户信息,其主键为sessionId;

服务器端在响应的header中,将sessionId返回给客户端,客户端得到sessionId,会将其存储到本地磁盘中:名称sessionId,值1234,Domain为.xxx.com,还有过期时间等;

当用户继续操作如添加购物车,此时客户端检测到本地有.xxx.com域名的cookie,会自动在请求header中加上该cookie,值为sessionId=1234,发给服务端;

服务器端接收到请求,检测sessionId为1234在缓存区有该主键的session,从而知道用户身份是admin用户,返回成功。

3、cookie的问题及解决方案
(1)清理掉cookie导致重新登录的原因?
当我们将浏览器中的cookie清除掉以后,它会清掉本地存储的sessionId信息,这样再次访问该网站,请求头里没有携带sessionId,后台无法通过sessionId检测到你是谁,就会认为你是没登录过的用户,让你重新登录。

(2)cookie容量较小,现在有的图片很大,无法存储,且有的服务器禁用cookie,如何解决?
可以采用HTML5的Session Storage,以支持较大的数据存储。

4、session的问题及解决方案
(1)长时间不登录导致账号被踢掉的原因?
服务器端的sessionId缓存空间很小,大概只有4k,当大量用户登录,服务器需要为每个用户创建session缓存空间,就不够用对服务器来说有压力,为了解决这个问题就有了session缓存的失效时间,一般为30分钟。

长时间不登录,如超过30分钟,服务器端的session超过失效时间就会自动清掉,此时客户端拿着老的cookie里存的sessionId去访问服务器,服务器检测不到对应的session信息,即不认识你,就会让你重新登录。

(2)服务器重启导致session缓存数据丢失的原因?
因为session数据存在缓存里,又没有落在磁盘上,服务器重启缓存数据会丢失,session缓存数据自然也就没了,这是正常的特性,如同未保存的word文档打开后数据丢失一样。

(3)session真正的问题是:集群环境下的数据共享问题
现在很多后台服务器都是分布式集群环境,比如我有2台web服务器,web1缓存中存储了登录后的用户基本信息,web2下单,那么在web2服务器上想要获取web1缓存中的用户信息是获取不到的。

为了解决这个问题,目前有2种替代方案:
第一种是:利用redis缓存存储,也就是不把缓存缓在单个服务器上,而是缓在一个redis缓存数据库里,这样web1可以写redis,web2读redis,大家都操作一份缓存数据;

第二种是:利用token,也就是用户基本信息不放在缓存中,而是写到http协议里,这样web1登录完了以后,把用户信息放在token里返回,web2操作时带着token去访问,服务器也能识别到用户身份。

cookie和session的区别?一文讲透的更多相关文章

  1. JavaWeb之Cookie和Session的区别

    Cookie和Session的区别 一.cookie机制和session机制的区别 ********************************************************** ...

  2. Cookie和Session的区别

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

  3. cookie 和session 的区别(转)

    二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有 ...

  4. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...

  5. Cookie 与 Session 的区别

    Cookie与Session的区别 cookie的简介 cookie是Web服务器保存在客户端的一系列文本信息 cookie的作用 对特定对象的追踪 统计网页浏览次数 简化登录 安全性能:容易信息泄露 ...

  6. 理解Cookie和Session的区别及使用

    资料一: Cookie和Session的区别 共同之处: cookie和session都是用来跟踪浏览器用户身份的绘画方式. 区别: cookie数据保存在客户端,session数据保存在服务端. s ...

  7. Token 、Cookie和Session的区别

    本文转至http://blog.csdn.net/tobetheender/article/details/52485948 https://blog.csdn.net/axin66ok/articl ...

  8. cookie 和session 的区别详解

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  9. Cookie和Session的区别详解

    本文引用自:http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一 ...

  10. cookie 和session 的区别

    假如我填好了淘宝的用户名密码,点击登录,浏览器客户端像服务器端发送请求,这时服务器端看这个用户是第一次登陆,session会让客户端这个浏览器生成个cookie,并给cookie一个session i ...

随机推荐

  1. 从module_init看内核模块

    开篇 module_init是linux内核提供的一个宏, 可以用来在编写内核模块时注册一个初始化函数, 当模块被加载的时候, 内核负责执行这个初始化函数. 在编写设备驱动程序时, 使用这个宏看起来理 ...

  2. Pytest 框架执行用例流程浅谈

    背景: 根据以下简单的代码示例,我们将从源码的角度分析其中的关键加载执行步骤,对pytest整体流程架构有个初步学习. 代码示例: import pytest def test_add(): asse ...

  3. 【故障公告】一而再,再而三,三翻四复:数据库服务器 CPU 100%

    会员救园,故障捣乱,每当困难时,故障们总是喜欢雪上加霜过来考验你. 今天下班前 17:43~17:47 期间,园子的 SQL Server 数据库服务器突然出现 CPU 100% 问题. 发现问题后, ...

  4. Vim深入使用指南

    Vim深入使用指南 Vim是一款功能强大的文本编辑器,被广泛用于编写和编辑各种类型的文档和代码. 安装Vim 可以操作系统下载并安装Vim.在安装完成后,通过在终端中输入vim命令来启动Vim. Vi ...

  5. 解决WPF+Avalonia在openKylin系统下默认字体问题

    一.openKylin简介 openKylin(开放麒麟) 社区是在开源.自愿.平等和协作的基础上,由基础软硬件企业.非营利性组织.社团组织.高等院校.科研机构和个人开发者共同创立的一个开源社区,致力 ...

  6. 解决软件安装无法自定义文件夹,自动安装在C盘 (Windows系统)

    其实就是软链接的简单应用 1.软件已经自动安装 2.完全退出当前软件 3.通过软件图标的属性找到其实际的安装目录 4.进入该软件的安装目录 5.将该软件整个剪切(你没有看错)到指定文件夹(自定义的安装 ...

  7. Oracle-复制表结构存在的问题

    在生产中,创建一个新表tbl_A,要求与已有表结构tbl_B一致 create table tbl_A AS select * from tbl_B where 1=2; --拷贝表结构tbl_B给t ...

  8. 内网离线安装docker并配置使用nexus为docker私服

    背景 本文简单记录下最近在内网服务器离线安装docker及配置nexus作为docker私服,踩的一些坑.docker和k8s这块技术我跟得不是很紧,18年的时候用过一阵docker,后来发现它并不能 ...

  9. Openssl Des3对压缩文件进行加密命令详解

    群友提问: 致力于明天: tar -cvf - WMG_Back_"$Today"|openssl des3 -salt -k hY91gd3GJAAfghECleLwWQAPGK ...

  10. Java面向对象编程的三大特性:封装、继承、多态。

    一.封装 封装的核心在于私有化(private),大部分情况下,来封装对象的属性,很少有封装方法的.通过将对象的属性封装,提供对外的公共方法来访问属性是最常见的方式. public static cl ...