HTTP 无状态协议

HTTP 本身是一个无状态的连接协议,无状态的意思是:每条请求/响应都是独立进行的,服务端每处理完一个客户端的请求之后就会断开连接,并且每条请求/响应与其之前(或之后)的请求/响应是没有任何关系的。即HTTP自身不具备保存之前发送过的请求或者响应的功能。

比如当我们打开微博的登录页,输入用户名和密码之后,浏览器将这些数据发送给服务器端,服务端验证成功之后,跳转到了我们的微博首页,但是接着如果我们希望查看自己聊天消息,由于 HTTP 的这种无状态性,服务端将无法知道我们在上一次HTTP请求中已经通过了验证,从而无法正确的处理这次请求。

为了解决这个问题。我们首先想到的办法是可以在所有的请求中都带上用户名和密码,这种方法虽然可行,但也大大加重了服务器的负担(每个请求都需到数据库验证)。更好的办法其实是使用 Cookie 与 Session 机制。

在 Web 应用中跟踪用户状态的办法有以下四种:

  • 建立包含有跟踪数据的隐藏字段(比如使用<input type="hidden">
  • 重写包含额外参数的URL(文末会介绍)
  • 使用持续的 Cookie
  • 使用 Session

Session 和 Cookie 是 Web 程序中较为常见的两个概念。它们的目的相同,都是为了克服 http 协议无状态的问题。

Cookie

Cookie 实际上是一小段由客户端(如浏览器)保存在本地的文本文件,它记录了你的用户ID、密码、浏览过的网页、浏览时间等信息。当客户端再次访问同一个网站时,客户端就会把请求连同 Cookie 一起发送给服务端,服务端通过检查该 Cookie,就可以辨认用户状态了。

Cookie 的传递流程

Cookie 是 HTTP 协议头的一部分,用于浏览器和服务器之间传递信息。

当客户端第一次向服务端发起请求时,服务端会创建一个 Cookie,并通过 HTTP 响应头中的 Set-Cookie 属性,来将 Cookie 信息返回给客户端,并通知客户端保存起来。

当客户端再次向服务端发起请求时,客户端就会把之前保存在本地的 Cookie 放入请求头中一并发送给服务端,服务端获得 Cookie 之后,就可以得到客户端的状态信息了。

1.请求报文(没有Cookie信息时)

GET /index HTTP/1.1
Host: www.baidu.com
* 首部字段内没有Cookie的相关信息

2.响应报文(服务器端生成 Cookie 信息)

HTTP/1.1 200 OK
Server: Apache
<Set-Cookie: sid=57111807181018; path=/;expires=Web,10-OCT-12 07:12:20 GMT>
Content-Type: text/plain; charset=UTF-8

3.请求报文(自动发送保存着的 Cookie 信息)

GET /image/ HTTP1.1
HOST: www.baidu.com
Cookie: sid=57111807181018

Cookie 中主要包含了NAME(名称)、path(路径)、domain(域名)、expires(有效期)、max-age(过期时间)几种不同的属性,它们各自起到不同的作用。例如通过设置 Cookie 的 maxAge 属性可以设置 Cookie 的过期时间,不设置 maxAge 被称为会话 Cookie,会话 Cookie 生命周期为从创建浏览器到关闭浏览器为止,只要关闭浏览器窗口,会话 Cookie 就会消失,它一般保存在内存中,而不是硬盘中。

如果设置了过期时间(setMaxAge(60*60*24)),浏览器就会把 Cookie 保存在硬盘上,对于关闭后重新打开的浏览器,这些 Cookie 依旧有效。

cookie过期时间设置方式:

cookie.setMaxAge(0);//不记录cookie

cookie.setMaxAge(-1);//会话级cookie,关闭浏览器失效

cookie.setMaxAge(60*60);//过期时间为1小时

Session

除了使用 Cookie 之外,Web 应用程序还经常使用 Session 来跟踪用户状态,与 Cookie 保存在客户端浏览器不同的是,Session 是将状态信息保存在了服务端上。服务端使用一种类似散列表的结构(也可能就是使用散列表)来保存信息。

session的工作原理

  1. 客户端第一次向服务器端发送请求时,服务端程序会为此客户端创建一个session,并生成一个与此session相关联的sessionId。(sessionId 的值应该是一个不会重复并且难以伪造的字符串)

  2. 服务端向客户端返回响应时,同时会将 sessionId 一起返回给客户端,客户端会将 sessionId 字符串保存下来。

  3. 当客户端再次访问服务端时,将 sessionId 一并发送给服务端。

  4. 服务端获取从客户端发送过来的 sessionId,就可以根据这个 id 获取保存在服务器中相应的数据了

  5. 当其他客户端也访问服务端时,就又会产生一个新的sessionId,类似以上的步骤进行处理。

客户端保存 sessionId 的方式可以是使用 Cookie。这样在交互过程中,浏览器就可以自动按照规则把这个标识发送给服务端。除此之外,也可以通过使用表单隐藏字段的方式,来将sessionId 传递给服务端,比如:<input type="hidden" name="sessionid" value="5711A1B807F18B1018">

又或者还可以通过 URL 重写来代替。所谓 URL 重写就是在返回给用户的页面里的所有的 URL 后面都追加 Session 标识符,这样用户在收到响应之后,无论点击响应页面里的哪个链接或提交表单,都会自动带上 Session 标识符。

经常有这样一种误解说的是当浏览器关闭后,session 也就被销毁了,实际上这个说法并不准确。

这是因为 sessionId 通常是被当作会话 Cookie 进行处理的,所以当我们关闭浏览器后,sessionId 也就销毁了,所有也就无法找到原来的 session 了。如果服务器设置的 Cookie 被保存在了硬盘上,或者直接改写了浏览器发出的 HTTP 请求头,把原来的 sessionId 发送给了服务端,那么这是仍然能够找到原来的 session 的。

参考:

https://www.cnblogs.com/andy-zhou/p/5360107.html

https://justsee.iteye.com/blog/1570652

理解Cookie和Session的更多相关文章

  1. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

  2. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

  3. 形象地理解Cookie和Session

    Cookie和Session的形象理解 通过实际生活中的银行卡来理解Cookie和Session间的关系: Cookie相当于银行卡 Session相当于银行账户 结合到银行存钱和取钱的过程来理解: ...

  4. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  5. 基础知识《十二》一篇文章理解Cookie和Session

    理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定 ...

  6. 深入理解Cookie和Session机制

    转载理解Cookie和Session机制 目录 Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存二进制图片设置Cookie的所有属性Coo ...

  7. 理解cookie,session,token

    彻底理解cookie,session,token 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新 ...

  8. [转帖]彻底理解cookie,session,token

    彻底理解cookie,session,token https://www.cnblogs.com/moyand/p/9047978.html 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已 ...

  9. 一文理解Cookie、Session

    一文理解Cookie.Session 1.什么是会话 用户打开浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称为一个会话: HTTP 是无状态,有会话的 HTTP 是无 ...

  10. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

随机推荐

  1. springboot 集成 dubbo(一)简介

    一.简介 1,springboot 是 一款快速开发的框架,减少了开发人员对配置文件的操作.采用一些注解来取代xml配置文件. 注解包含预先封装的注解和开发人员自定义注解.同时使用Maven.Grad ...

  2. QT调用CHM方法

    QDesktopServices desktopServices;QString strUrl=QCoreApplication::applicationDirPath () ;strUrl=QStr ...

  3. Vue Elementui中的Tag与页面其它元素相互交互

    参考:https://www.jb51.net/article/147917.htm 思路 一.多选框勾选,出现对应的tag: 1.利用watch监听多选框绑定的值A(数组)的变化:2.根据A的变化, ...

  4. 深度学习_1_Tensorflow_1

    # 深度学习 # 图像识别,自然语言处理 # 机器学习 深度学习 # 分类:神经网络(简单) 神经网络(深度) # 回归 图像:卷积神经网络 # 自然语言处理:循环神经网络 # cpu:运行操作系统, ...

  5. 如何将公式插入到word

    平台:win10 x64+ office 2010+ Mathpix Snipping Tool +mathtype6.9b   直接安装就行,下载好了以后,要和word连接起来还需要下载一个插件,有 ...

  6. Bootstrap treegrid 实现树形表格结构

    前言 :最近的项目中需要实现树形表格功能,由于前端框架用的是bootstrap,但是bootstrapTable没有这个功能所以就找了一个前端的treegrid第三方组件进行了封装.现在把这个封装的组 ...

  7. VMware无法连接MKS:套接字连接尝试次数太多解决

    粘贴自:https://jingyan.baidu.com/article/425e69e61eb578be15fc16ae.html VMware在开启虚拟机的时候,突然弹出[无法连接MKS:套接字 ...

  8. oracle 初试 hint

    最近在研究oracle的视图问题,本来想全转成 物化视图(materialized view)的,这样可以极大提升系统的响应时间,无奈工作量太大,所以就研究了SQL优化的问题. 我这个普通视图 有36 ...

  9. BZOJ 1135 P3488 LYZ-Ice Skates 线段树+Hall

    https://www.luogu.org/problem/P3488 根据Hall定理 左边任意一个区间L-R a[i]的和sum[l~r] 都要<= (R-L+1+d)*K 把(R-L+1) ...

  10. ThreadPoolExecutor源码分析一

           在线程池出现之前,每次需要使用线程,都得创建一个线程.但是,在java的运行环境中,创建一个线程是非常耗费资源和时间的.是否可以把线程重复利用,减少线程的创建次数.基于此,java1.5 ...