session,sessionid,cookie之间的关系解析

文章目录

  • session,sessionid,cookie之间的关系解析
    • 1.简介
    • 2.session和cookie定义,创建,周期和联系
      • 2.1cookie
      • 2.2session
    • 3.如果禁用cookie后,如何解决账号身份识别?
    • 4.session和cookie的关系

1.简介

网上有很多关于他们的文章,我这里以我自己的理解来写这篇文章。

session,cookie这个关系弄明白了,对你开发后端收益匪浅。

下面我将以解释他们是什么,彼此之间有什么联系,生命周期,如何使用等方面进行描述。

2.session和cookie定义,创建,周期和联系

2.1cookie

Cookie定义:有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户浏览器上的数据。浏览器为了保存用户状态的对象,该对象是服务器创建,存于浏览器。

cookie的内容:主要包括:名字,值,过期时间,路径和域。

cookie在浏览器的工作机制:cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。当客户端第一次(首次)请求服务器的时候不会携带Cookie,因为这个cookie由服务器端生成,首次还没有他。

cookie的生命周期:

  1. cookie的创建:Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie),在服务器创建cookie对象后,响应给浏览器,在响应头中的set-cookie字段中存放该cookie发给浏览器,浏览器接收后会将set-cookie中的内容放到浏览器的cookie缓存容器中。

  2. cookie的过期时间:如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。cookie.setmaxage设置为0时,会马上在浏览器上删除指定的cookie;cookie.setmaxage设置为-1时,代表关闭当前浏览器即失效。

自己对cookie的理解:cookie就是一个数据,这个数据中通常有sessionid字段信息,举例:SESSIONID=asdfghjkl,也就是cookie中数据是key=value这种格式,cookie中除了存储有sessionid,还有其他的一些信息;cookie不止一个,我用同一个浏览器访问百度打开一个网页窗口,访问谷歌打开一个网页窗口,通过f12查看cookie可以发现各自的网页的cookie是独立的,他们的内容不一样;我的理解是一个浏览器窗口有一个独立的cookie存放容器,该容器中的key就是当前访问服务器的url,value就是cookie对象集合(下图的红框部分),在这个cookie对象集合中可以看到很多条数据内容(每一条数据就是一个cookie对象,他们有自己的生命周期和作用范围),我们浏览器每次给服务器发送请求时,会加载cookie中的信息,并判断那些属性是作用在该请求范围中的,筛选出来符合条件的属性数据,并和请求一起发送给服务器。

为了进一步说明为什么上图红框中是一个cookie对象集合,可以在服务器端controller层写一个创建cookie对象的接口代码如下:

//创建了一个cookie,名字是"name" 值是"Gareen"Cookie c = new Cookie("name", "Gareen");//表示这个cookie可以保留一天,如果是0,表示浏览器一关闭就销毁c.setMaxAge(24 * 60 * 60);//Path表示服务器的主机名,只有浏览器通过这个主机名访问服务器的时候,才会提交这个cookie到服务端c.setPath("127.0.0.1");//将自己创建的cookie对象相应给浏览器,把该对象放到响应头中的set-cookie字段内容中然后发回给客户端,客户端会把set-cookie字段中内容放到浏览器的cookie缓存容器中,当下一次浏览器请求,就会在请求头中的cookie字段中加上这个cookie对象,后端再通过解析请求头拿到他response.addCookie(c);

通过上图可以发现我们创建的cookie对象在浏览器中成了一条数据,印证了我上边说的这是一个cookie对象集合,并且每个cookie对象都有属于自己的生命周期和作用范围

服务器接受到请求后,会默认去请求头中找cookie字段的属性,并将其内容解析,大概的思路如下:

服务器端获取所有浏览器传递过来的cookie,因为可能是cookie对象集合,使用集合接收

Cookie[] cookies = request.getCookies();

如果浏览器端没有任何cookie,得到的Cookie数组是null

if (null != cookies )

遍历所有的cookie

for (int d = 0; d <= cookies.length - 1; d++) {
out.print(cookies[d].getName() + “:” + cookies[d].getValue() + “
”);
}

2.2session

session的定义:服务器为了保存用户状态而创建的一个特殊的对象。session是存于服务器,cookie是存于浏览器

session的主要内容:Attribute对象(这个是我们自己将数据存入session的地方,比如想将当前账户信息存入session,就可以存入这里),Id,这个id就是sessionid,是服务器在创建session对象时生成的id,使用了散列表结构,所以生成的sessionid是唯一的,我们就是利用sessionid唯一这个依据来确认每次请求的账户信息。

session在服务器的工作机制:当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识------------称为session id,如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

sessionId在浏览器作用范围:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。

session的生命周期:

  1. session创建:Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。

  2. session的过期时间:服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为30分钟。也可调用Session的invalidate方法让其强制失效。

3.如果禁用cookie后,如何解决账号身份识别?

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。
经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。还可以使用token技术,摆脱依赖sessionid去验证,直接使用token作为验证机制

4.session和cookie的关系

本质上是一样的,都是用于保持用户状态或实现请求与请求间的数据共享的一种机制。

cookie和session都由服务器创建

Cookie存在客户端,Session存在服务器端。

以最基础的sessionid存放过程为例:

1、当客户端浏览器第一次向服务器发请求时(服务器检查请求头中有无Cookie字段),服务器会创建一个Session,而每个

Session有一个唯一的编号(sessionid)

2、服务器将session的唯一编号作为响应头中的set-cookie字段内容发回给客户端 ,而这个sessionid会先放入服务器默认创建的cookie对象中,再将cookie对象放到set-cookie字段中。

3、客户端接到响应后,将set-cookie字段的内容存到缓存中,以后每次请求,请求头中都带上cookie字段,且字段内容中包含发给

客户端的session的唯一编号 。

参考:

cookie的创建和访问_纯粹无忧的博客-CSDN博客_创建cookie

session的生命周期 - 人情世故 - 博客园

session,sessionid,cookie之间的关系解析相关推荐

  1. cookie、session与token之间的关系

    cookie.session与token之间的关系 token 令牌,是用户身份的验证方式. 最简单的token组成:uid(用户唯一的身份标识).time(当前时间的时间戳).sign(签名). 对 ...

  2. 类和类之间的关系解析-1

    一.泛化关系      泛化关系也称继承关系,指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明 ...

  3. Function、Object、Prototype 之间的关系解析

    前提:js中所有的内置对象都是Function 的实例. 例如:Array\String\Number... 等 原理剖析: 对象属性搜索的原理就是按照对象的 __proto__ 属性进行搜索,直到_ ...

  4. 系统运维、应用运维、硬件运维之间的关系解析

    硬件运维.系统运维和应用运维是三个不同的方向,虽然现实中存在一些交叉,比如硬件运维需要掌握服务器操作系统,运维工程师同时负责系统运维和应用运维工作,但是他们的架构体系.岗位职责和未来发展都不太一样,下 ...

  5. qq空间登陆 cookie_看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了||CSDN博文精选...

    作者:程序员cxuan Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 ...

  6. php session和cookie区别,php中session和cookie的区别是什么?

    一.Session (1)Session的由来以及介绍 Session:在计算机中,尤其是在网络应用中,称为"会话控制",生存时间为用户在浏览某个网站时,从进入网站到关闭这个网站所 ...

  7. java cookie全解析(session与cookie的机制和原理)

    http://www.cnblogs.com/agilework/articles/2290240.html 摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚 ...

  8. 浅谈Session与Cookie的关系

    阅读目录 一.概念理解: 首先cookie是服务端识别客户的唯一标识的依据,客户在访问网站时候,服务端为了记住这个客户,会在服务端按照它的规则制作一个cookie数据,会将这个cookie数据保留在服 ...

  9. 用大白话解析函数调用,系统调用和API之间的关系

    一.官方的解释(大概了解一下) 函数调用: 函数调用是计算机编或运行时,使用某个函数来完成相关命令. 系统调用: 系统调用是用户在程序中使用"访管指令"调用由操作系统提供的子功能集 ...

最新文章

  1. Windows Server 2012如何实现双网卡绑定
  2. 2011.8.2号面试
  3. Java之线程安全的几种方式
  4. python零基础学习教程之Python 运算符
  5. HDU2072 单词数(解法二)【废除!!!】
  6. Memcached、Redis、RabbitMQ
  7. 英飞凌TC297 PSPR与DSPR
  8. Java程序编译及打包
  9. 为什么房价不能跌,房租必须涨
  10. html手机端富文本,移动端富文本踩坑
  11. 用欧拉公式推导三角函数所有公式包括 倍角公式-半角公式-和差化积-积化和差...
  12. 电脑html接口显示器不亮,电脑主机开了显示器没反应无信号及键盘鼠标不亮的解决方法...
  13. Android双目三维重建:Android双目摄像头实现双目测距
  14. OSSIM开源安全信息管理系统(十六)
  15. java web短信验证码_在Web项目中手机短信验证码实现的全过程记录
  16. 信号幅值归一化(Python)
  17. navicat连接数据报10060错误
  18. MySQL 命令环境变量设置方法
  19. 哈尔滨自考计算机本科,黑龙江自考本科主考院校有哪些?黑龙江自考本科哪些专业可以报考?...
  20. 短视频社交应用系统开发-节省人力、物力成本,快速拥用短视频社交主流功能

热门文章

  1. 从草根到百万年薪程序员的二十年风雨之路
  2. pyqt5写代码流程
  3. b 1f 和 b 1b 汇编解释
  4. vsftpd基于mysql_vsftpd的基于pam_mysql的虚拟用户配置示例
  5. set-valued function called in context that cannot accept a set
  6. 百度宣布开放其输入法的应用程序接口
  7. 雷神之锤源码linux,雷神之锤3 的源代码查看
  8. Python基础练习之名片管理器
  9. 用keras创建拟合网络解决回归问题Regression
  10. 实时的空号检测API,稳定可靠