http(请求方法,状态码,Cookie与)

目录

1.http中常见的Header(KV结构)

2.http请求方法

2.1 请求方法

2.2 telnet

2.3 网页根目录

2.3.1 概念

2.3.2 构建一个首页

2.4 GET与POST方法

2.4.1 提交参数

2.4.2 GET与POST提交参数对比

2.4.3 GET和POST对比

3.状态码

3.1 状态码分类

3.2 3XXX状态码

3.2 长连接与短链接

4.Cookie与Session

 4.1 Cookie

4.1.1 Cookie的作用

4.1.2 Cookie的存在形式

4.1.3 Cookie的原理

4.1.4 设置Cookie

4.2 Session

4.2.1 Session的引入

4.2.2 Session的原理


1.http中常见的Header(KV结构)

content-length:该结构的作用是表示正文有多少个字节。空行的作用是保证可以识别报文被读完,而报文中的ContentLength保证报文被读完,防止将下一个http请求读到,保证信息的完整性。如果报头中的ContentLength不存在,则代表报文为空。

Connect-Type:正文的类型,使用Content-Type对照表进行查询。

Location:当发生跳转时,跳转的位置。

Connection:判断是否有长连接。

2.http请求方法

2.1 请求方法

GET:获取资源

POST:传输资源主体

PUT:传输文件

HEAD:获得报头

DELETE:删除文件

OPTIONS:询问支持的方法

TRACE:追踪路径。

CONNECT:要求用隧道协议连接代理

LINK:建立和资源之间的联系

UNLINK:断开连接关系

其中网站可以暴露给用户的方法一般只有三个:GET,POST,HEAD。

2.2 telnet

使用telnet指令可以作为客户端,向网页的服务端申请服务,首先对telnet指令进行安装:

sudo apt update

sudo apt install telnet

sudo apt update

sudo apt install xinetd telnetd

sudo systemctl enable xinetd

sudo systemctl start xinetd

telnet www.baidu.com 80 //连接百度网站的端口号80

ctrl+]进入telnet命令行,回车进入下一行

HEAD/HTTP/1.0

向百度服务器申请网页根目录(/)下的信息,客户回接收到一个1.0版本的http协议的信息。注意,是使用HEAD方法来进行申请的,因此只会得到一个报头的信息:

当我们使用GET方法就会得到报头和资源(报文信息):

2.3 网页根目录

2.3.1 概念

注意我们发送的请求中,有一个‘/’代表网页根目录,网页根目录即.server所在的文件夹:

但是我们要向服务器申请的,一般是一个资源,最终应该是/a/b/c类似的东西,即访问c资源。因此就会有一个规定:

规定,申请网页根目录的时候,访问的是根目录中的首页资源,通常是一个html。

比如我们在浏览器中输入:IP地址:8080/,就会拿到对应浏览器的首页资源。基本所有的网站都有其对应的首页。

2.3.2 构建一个首页

同理,我们也可以在我们的云服务器上的网页根目录来构建一个首页资源:

    string html_file=WWWROOT;
    html_file+=HOMEPAGE;
    //if(method=='\') path=./index.html   //会获取报头中的method信息,此时将路径设为首页。
    struct stat st;
    stat(html_file.c_str(),&st);
    std::string http_response = "http/1.0 200 OK\n";
    http_response += "Content-Type: text/html;charset=utf8\n"; // text/plain,正文是普通的文本
    http_response+="Content-Length: ";
    http_response+=to_string(st.st_size);
    http_response+="\n";
    http_response += "\n";                         //空行
    std::ifstream in(html_file);
    if(!in.is_open())
    {
        cerr<<"open html error"<<endl;
    }
    else
    {
        string content;
        string line;
        while(getline(in,line))
        {
            content+=line;
        }
        http_response+=content;
        in.close();
    }
    send(sock,http_response.c_str(),http_response.size(),0);
    close(sock);

建立一个html的文件,在服务端打开它,并读取其中的内容,放在正文中发送给客户端。客户端会自行解析html文件。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf_8">
    </head>
    <body>
        <h3>hello myfriend!</h3>
    </body>
</html>    

2.4 GET与POST方法

2.4.1 提交参数

修改html代码,可以达到提交参数的目的:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <h5>hello 我是首页!</h5>
        <h5>hello 我是表单!</h5>
        <form action="/a/b/handler_from" method="GET">
            姓名: <input type="text" name="name"><br/>
            密码: <input type="password" name="passwd"><br/>
            <input type="submit" value="登陆">
        </form>
    </body>
</html>  

此时再进行访问,就可以看到这个界面:

2.4.2 GET与POST提交参数对比

当使用GET方法提交参数(输入姓名和密码)的时候,提交的信息会显示在URL中。

如果以POST方法提交参数(将method改成POST),提交的信息会显示在正文中。

2.4.3 GET和POST对比

对比一:

GET主要用于获取,是最常用的,占70%默认一般获取所有的网页都是GET方法,如果GET提交参数(它可以提交的!!),通过URL进行参数拼接,然后传递给服务端。

POST主要用于推送,是提交参数的常用方法,如果提交参数,一般是通过正文提交的。

对比二:

参数提交的位置不同,GET不私秘,会将重要的信息回显到输入框中,增加了被盗取的危险。POST比较私密(不代表安全),不会回显到浏览器URL的输入框中。

GET通过URL传参,而URL是有大小限制的

对比三:

如何选择:如果提交的参数不敏感,数量非常少,可以采用GET,否则使用POST。

GET和POST是前后端数据交换的重要方式。

3.状态码

3.1 状态码分类

通常来说,状态码分为五类:

1XX:information(信息性状态码),接收的请求正在处理。

2XX:Success(成功状态码),请求正常处理完毕。

3XX:Redirection(重定向状态码),需要进行附加操作以完成请求。

4XX:Client Error(客户端错误状态码),服务端无法处理请求。

5XX:Server Error(服务端错误状态码),服务器处理请求出错。

注意:由于应用层是人要参与的,人的水平参差不齐,http的状态码很多人不清楚该如何使用,又因为浏览器的种类太多了,导致可能对状态码的支持没有那么好,类似于404的状态码对浏览器没有指导意义,浏览器只会正常显示网页。这也就意味着404的页面需要程序员来编写。

3.2 3XXX状态码

3XXX状态码是有特殊意义的,代表重定向。

301:永久重定向。

302或307:代表临时重定向。

重定向:当访问一个网站的时候,会让我们跳转到另一个网址。

永久重定向:当用户访问一些老网址的时候,老网址会告诉浏览器,资源已经被搬运到其他的网址去了,此时会更新一些浏览器的缓存,然后跳转到新网址。当再次访问老网址的时候,就不会访问老网址了而是直接访问新网址。

临时重定向:当我们访问某种资源的时候,提示登录,跳转到登录页面,输入用户名和密码之后,再跳转回原来的页面。跳转网址是为了执行某一个任务,而不是资源搬迁。

重定向是需要浏览器提供支持的,浏览器必须能够认识到状态码,由服务端告知浏览器应该跳转到哪里。

    string response="http/1/1 301 Permanently moved\n";
    response+="Location: https://www.qq.com/\n";
    response+="\n";
    send(sock,response.c_str(),response.size(),0);

使用Location来将网页重定向到腾讯首页,此时访问该网站就会直接跳转到腾讯的首页了。

3.2 长连接与短链接

注意这里使用的是1.1,我们之前使用的都是1.0版本,而1.0版本代表的是短链接。

短链接的作用在于,我们申请服务器上所有资源的时候都是请求,响应然后断开连接。当访问一个由多个元素构成的网页的时候,http/1.0需要多次进行http请求。http是基于TCP进行通信的,TCP通信的时候要经过(建立连接,传输数据,断开连接),每一次http都需要执行这一过程。

当网页上有图片的时候(在html页面添加):

<img src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww.2008php.com%2F09_Website_appreciate%2F10-07-11%2F1278861720_g.jpg&refer=http%3A%2F%2Fwww.2008php.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1663734890&t=27a504cab6d3d39a9b1d65cdf171784e" alt>

对于短链接来说,此时客户端在申请网页的同时,还会申请图片(在对应图片网站的客户端申请)。

服务端上有很多资源,一个网页中有很多资源,如果对每一个资源都发起http请求,是很麻烦的,因此引入了长链接。在通信的时候会复用同一个链接。

长连接可以减少频繁建立TCP链接,达到提高效率的目的。在报头属性中的Connection=keep-alive表示支持长链接,如果没有Connection属性或者Connection=close不支持长链接,我们的代码是短链接代码,如果想支持长链接需要在代码上做修改

4.Cookie与Session

 4.1 Cookie

4.1.1 Cookie的作用

在我们访问网站的时候,登录之后,访问该网站的其他内容,网站是如何识别我们是否已经登录了呢?注意,http协议是不记录历史上的http的信息的。这并不是http协议本身需要解决的问题,当时http可以提供一些技术支持来保证网站具有会话保持功能。

比如我们登录的CSDN网站,刷新一次页面(重新进行一次资源请求,此时就不再需要登录了,这就是Cookie的作用。

在谷歌浏览器的上方有一个锁的图标,点击它就可以看到正在使用的Cookie了。

当我们将这些Cookie移除的时候(移除了所有Cookie信息,其中包括登录信息)时,再次刷新网站,就会发现需要我们来进行登录了。
登录之后发现Cookie信息又被重新存储了。

4.1.2 Cookie的存在形式

Cookie有两种存在形式,可以是一个文件(在主机的用户夹下可以找到),也可以是一个内存,它是与浏览器同生命周期的,当把浏览器关掉,就没有Cookie信息了。

4.1.3 Cookie的原理

在浏览器的角度看来,Cookie是一个浏览器中的文件,文件中存放的是用户的私密信息。

在http通信中,一旦该网站有Cookie,在发起任何请求的时候,都会在报头中自动携带Cookie信息。

4.1.4 设置Cookie

在服务端向客户端的响应中,可以使用Set-Cookie设置Cookie:

    http_response+="Set-Cookie: id=1111\n";
    http_response+="Set-Cookie: password=2222\n";

此时可以发现,进行访问的时候,浏览器处就有了Cookie的信息:

当再次访问的时候,服务器会接收到Cookie的内容:

4.2 Session

4.2.1 Session的引入

在了解了Cookie之后,如果有人盗取了我的Cookie文件,以我的身份来认证访问特定的资源,那么就会有安全隐患。

因此我们引入了Session,核心思路是将用户的私密信息保存在服务端。

4.2.2 Session的原理

此时就可以保证浏览器中的Cookie的信息是服务端文件的session_id,所有的http请求都会有浏览器自动携带的cookie中的session_id,后续server依旧可以认识client,也是一种会话保持的功能,但是我们还有cookie文件被泄露的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928457.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蘑菇书(EasyRL)学习笔记(3)

q1、学习与规划 学习&#xff08;learning&#xff09;和规划&#xff08;planning&#xff09;是序列决策的两个基本问题。如下图所示&#xff0c;在强化学习中&#xff0c;环境初始时是未知的&#xff0c;智能体不知道环境如何工作&#xff0c;它通过不断地与环境交互&#x…

攻防世界-fileclude-文件包含

赛前回顾 1.题目打开后是文件包含的代码&#xff0c;如下 函数作用 highlight_file(__FILE__) //显示代码到网页 isset //检查变量是否存在并且非null(空) !empty //php内置函数&#xff0c;检查变量是否为空或未设置&#xff0c;正常变量为空会触发&#xff0c;但是有个…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…

Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体

目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…

【JavaEE初阶 — 网络编程】实现基于TCP协议的Echo服务

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

开发者如何使用GCC提升开发效率GUI操作

看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…

shell编程7,bash解释器的 for循环+while循环

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题

HarmonyOS开发中&#xff0c;如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…

【Python】Selenium模拟在输入框里,一个字一个字地输入文字

我们平常在使用Selenium模拟键盘输入内容&#xff0c;常用的是用send_keys来在输入框上输入字&#xff1a; 基本的输入方式&#xff1a; input_element driver.find_element(By.ID, searchBox) input_element.send_keys("我也爱你") #给骚骚的自己发个骚话不过这种…

泷羽sec学习打卡-shell命令6

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell6 if条件判断for循环-1for循环-2实践是检验真理的唯一标准 if条件判断 创建…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…

数据分析案例-笔记本电脑价格数据可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化&#xff0c;传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念&#xff0c;如Trace和Span&#xff0c;并讨论了其基本原理。接着&#xff0c;文章介绍了SkyWa…

游戏引擎学习第25天

Git: https://gitee.com/mrxiao_com/2d_game 今天的计划 总结和复述&#xff1a; 这段时间的工作已经接近尾声&#xff0c;虽然每次编程的时间只有一个小时&#xff0c;但每一天的进展都带来不少收获。尽管看起来似乎花费了很多时间&#xff0c;实际上这些日积月累的时间并未…

GaussDB TPOPS 搭建流程记录

目录 前言 环境准备 安装前准备 安装TPOPS 总结 前言 由于工作需要&#xff0c;准备将现有Oracle数据切换至GaussDB数据库。在这里记录一下安装GaussDB数据库过程踩的坑。 首先&#xff0c;我装的是线下版本&#xff0c;需要先装一个GaussDB轻量化管理平台&#xff08;…

Web网页设计作业成品源码分享(持续更新)

&#x1f389;Web前端大作业专栏推荐 &#x1f4da;Web前端期末大作业源码分享 ✍️html网页设计、web前后端网站制作、大学生网页设计作业、个人网站制作、jQuery网站设计、uniapp小程序、vue网站设计、node.js网站设计、网页成品模板、期末大作业&#xff0c;各种设计应有尽有…