参考:https://itbilu.com/other/relate/Ny2IWC3N-.html

Cookie和Session都是为了解决HTTP协议的无状态问题,存储HTTP通讯中客户端与服务器之间的会话状态。不同的cookie依赖HTTP请求头与响应头实现存储在客户端,而Session存储在服务器端,Session可以通过Cookie实现,也可以使用URL回写的方式实现。

HTTP的无状态

HTTP协议是无状态的,客户端(浏览器)与服务器之间基于请求-响应 实现数据交互,响应结束后两者之间的连接就会断开。由于每次会话都是一新连接,所以服务器无法从连接上获取会话状态。这样就会带来一些问题,如:页面发生跳转服务器无法得知用户上一页面输入,也无法得知用户是否登录等。

解决方法:一个HTTP请求是由3部分构成的:状态行、请求头、请求体。其中状态行和请求头在所有的HTTP请求方法中存在,

请求体只有POST,PUT等部分请求中存在

服务器收到客户端的请求之后,会对用户进行响应,一个HTTP响应也同样由3部分构成:状态行、响应头、响应体。

响应体只存在部分HTTP请求方法响应中。

如上所示,HTTP请求/响应中,除正文外,还有一个请求/响应头。而这个 请求响应头都是可以设置的。根据这个特性我们可以在请求头加一个记录用户状态信息请求头,就可以实现用户状态的传递。

这也是cookie的实现方式。cookie是存储在客户端的一个特殊的字符串,在发送HTTP请求时,这个字符串会添加到一个名为Cookie的请求头中一同发送给服务器。Session实现类似,不同的是状态信息存储在服务器中,而只是客户端的Cookie中存储了表示该会话标示的SessionId

HTTP消息头(常见的http请求头与响应头)

HTTP消息头是指,在超文本传输协议(Hypertext Transfer Protocol)的请求和响应消息中,协议头部分的那些组件。HTTP消息头用来准确描述正在获取的资源、服务器或者客户端的行为,定义HTTP事务中具体操作参数

关于HTTP请求头

Accept :可接受的响应内容类型(Content-Types)

Accept-Encoding:可接受的响应内容的编码方式

Cookie:由之前服务器通过Set-Cookie设置的一个HTTP协议Cookie

Host:服务器的域名以及服务器所监听的端口

Origin:发起一个针对跨域资源共享的请求来源

Connection:客户端(浏览器)想要优先使用的连接类型

Proxy-Connection:用来对 HTTP 连接进行说明

Referer:表示浏览器所访问的前一个页面,

User-Agent:浏览器身份标示字符串

响应头

Access-Control-Allow-Origin:指定哪些网站可以跨域资源共享

Cookie

HTTP协议是一种无状态协议、客户端与服务器建立并传输数据,数据传输完成后,连接就会关闭,由此服务器无法知道上次干什么了

Cookie是解决HTTP无状态的有效手段,服务器可以设置或读取Cookie中所包含的信息。当用户登录后,服务器会发送登录凭据的Cookie到用户浏览器客户端,而浏览器对该Cookie进行某种形式的存储。用户再次访问该网站,浏览器就会发送该Cookie到服务器,服务器对该用户进行验证,合法时,用户不必输入用户名密码可直接登录

本质上讲,Cookie是一段文本信息。客户端请求服务器,如果服务器需要记录用户状态,就在响应用户请求时,发送一段cookie信息,客户端浏览器保存改Cookie信息,当用户再次访问该网站时,浏览器会把Cookie做为请求信息的一部分提交改服务器。服务器检查Cookie内容,以此来判断用户状态,服务器还会对Cookie信息进行维护,必要时对Cookie内容进行修改。

Cookie类型:按存储分为内存式Cookie和硬盘式Cookie,内存式Cookie存储在内存中,浏览器关闭就会消失,硬盘式Cookie只有等Cookie过期才会清除

Cookie通过Cookie请求头和setCookie响应头实现

Set-Cookie-服务器响应头,用于告诉客户端要设置cookie

Cookie-请求头,根据Set-Cookie设置并保存到客户端的Cookie值,会再次发送HTTP请求时通过这个请求头一同发送到服务器。

用户请求客户端后,如果需要记录状态服务器会在请求响应中包含一个Set-Cookie响应头,会将Cookie保存到客户端

对于一个需要保存状态的HTTP响应来说

客户端收到响应头之后,会将Cookie UserID=name 进行存储,并设置超过时间3600秒而Version是Cookie的版本

再次请求服务器时,客户端会在请求头中包含一个Cookie请求头,其值就是从服务器返回来的状态信息

Session

Cookie很好的解决了HTTP通讯中状态问题,但其本身也存在一些问题,如:

客户端存储,可能会被修改或删除

发送请求时,Cookie会被一起发送给服务器,当Cookie数据量较大时会带来额外的请求数据

客户端对Cookie大小有一定限制

Session解决了Cookie的一些缺点,Session同样为了记录用户状态,对每个用户来说,相应的一个状态保存在服务器中,而只是在客户端记录一个sessionID用于区分哪个用户的Session

与cookie相比Session有一定优势

Session值存储在服务器,相对来说安全

客户端发送给服务器只有一个sessionID,数据量小

Session同样需要客户端存储一个sessionID,可以这个值存储在Cookie,每次发送请求时,通过Cookie请求将其发送到服务器,也可以不使用cookie,而将sessionID做为一个额外的请求参数,通过URL或请求体发送到服务器

在探http请求的更多相关文章

  1. 巧妙设备MTU的大小,轻松提网速

    MTU是什么? "MTU=最大传输单元 单位:字节" 我们在使用互联网时进行的各种网络操作,都是通过一个又一个"数据包"传输来实现的.而MTU指定了网络中可数据 ...

  2. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  3. Android之EACCES (Permission denied)与Permission denied异常探密

    话说,Accipiter君,最近又开始怒学Android了,记得刚开始还是09年学的,现在的手机还是华为出的最早的一款Android手机C8500,那时候就想好好学习Android,赚点小钱,可是~~ ...

  4. 再探jQuery

    再探jQuery 前言:在使用jQuery的时候发现一些知识点记得并不牢固,因此希望通过总结知识点加深对jQuery的应用,也希望和各位博友共同分享. jQuery是一个JavaScript库,它极大 ...

  5. DIOCP 运作核心探密

    来自网友天地弦的DIOCP早已经广为人知了,有很多的同学都用上了它,甚至各种变异.修改版本也出了不少.我最近也在学习DIOCP,打算将它用于自己的服务端,今天让我们来一起探密它(DIOCP)的运作核心 ...

  6. 一步步教你为网站开发Android客户端---HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新ListView

    本文面向Android初级开发者,有一定的Java和Android知识即可. 文章覆盖知识点:HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,动态更新List ...

  7. [老老实实学WCF] 第五篇 再探通信--ClientBase

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  8. 再探ASP.NET 5(转载)

    就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. Visual Stud ...

  9. ASP.NET/MVC/Core的HTTP请求流程

    ASP.NET HTTP管道(Pipeline)模型 1. 先讲一点,再深刻思考 一般我们都在写业务代码,优化页面,优化逻辑之间内徘徊.也许我们懂得HTTP,HTTPS的GET,POST,但是我们大部 ...

随机推荐

  1. 深度学习RNN实现股票预测实战(附数据、代码)

    背景知识 最近再看一些量化交易相关的材料,偶然在网上看到了一个关于用RNN实现股票预测的文章,出于好奇心把文章中介绍的代码在本地跑了一遍,发现可以work.于是就花了两个晚上的时间学习了下代码,顺便把 ...

  2. 基于Linux的Samba开源共享解决方案测试(五)

    对于客户端的网络监控如图: 双NAS网关50Mb码率视音频文件的稳定写测试结果如下: 100Mb/s负载性能记录 NAS网关资源占用 稳定写 稳定写 CPU空闲 内存空闲 网卡占用 NAS1 16个稳 ...

  3. 使用promise对象封装一个ajaxGet函数

    function promiseAjax(url,data){        var pro = new Promise(function(success,failed){           承诺一 ...

  4. 显式锁(四)Lock的等待通知机制Condition

       任意一个Java对象,都拥有一组监视器方法(定义在根类Object上),主要包括:wait( ).wait(long timeout).notify().notifyAll()方法:这些方法与关 ...

  5. Java内存原型分析:基本知识

    转载: Java内存原型分析:基本知识 java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静 ...

  6. Sklearn与特征工程

    Scikit-learn与特征工程 “数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这句话很好的阐述了数据在机器学习中的重要性.大部分直接拿过来的数据都是特征不明显的.没有经过处理的或者说 ...

  7. js 断点调试

  8. leetcode107

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  9. leetcode268

    public class Solution { public int MissingNumber(int[] nums) { var list = nums.OrderBy(x => x).To ...

  10. vue基础——vue介绍

    声明式渲染——文本插值: 数据和dom已经进行了关联,所有东西都是响应式的 index.html <div id="app0"> {{message}} </di ...