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

news2024/12/26 23:04:38

目录

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文件被泄露的风险。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将 pdf 文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需…

机器学习周志华学习笔记-第13章<半监督学习>

机器学习周志华学习笔记-第13章&#xff1c;半监督学习&#xff1e; 卷王&#xff0c;请看目录 13半监督学习13.1 生成式方法13.2 半监督SVM13.3 基于分歧的方法13.4 半监督聚类 13半监督学习 前面我们一直围绕的都是监督学习与无监督学习&#xff0c;监督学习指的是训练样本包…

106.【C语言】数据结构之二叉树的三种递归遍历方式

目录 1.知识回顾 2.分析二叉树的三种遍历方式 1.总览 2.前序遍历 3.中序遍历 4.后序遍历 5.层序遍历 3.代码实现 1.准备工作 2.前序遍历函数PreOrder 测试结果 3.中序遍历函数InOrder 测试结果 4.后序遍历函数PostOrder 测试结果 4.底层分析 1.知识回顾 在99.…

1.Git安装与常用命令

前言 Git中会用到的一些基本的Linux命令 ls/ll 查看文件目录 (ll可以看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 1.下载与安装 安装成功后鼠标右键会出现Git Bash和Git GUI Git GUI&#xff1a;GUI图形化界面 Git Bash&#xff1a;Git提供的命令行工具 当安装…

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

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

Spring Cloud+Nacos+KMS 动态配置最佳实践

作者&#xff1a;柳遵飞 前言 Spring Cloud 框架在微服务领域被广大开发者所使用&#xff0c;Value 是每位开发者都会接触到的注解&#xff0c;在 SpringBean 中可以通过 Value 注解引用 application.properties 属性&#xff0c;实现配置代码分离&#xff0c;提升应用代码部…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

微软表示不会使用你的 Word、Excel 数据进行 AI 训练

​微软否认使用 Microsoft 365 应用程序&#xff08;包括 Word、Excel 和 PowerPoint&#xff09;收集数据来训练公司人工智能 (AI) 模型的说法。 此前&#xff0c;Tumblr 的一篇博文声称&#xff0c;雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据&#xff0c;用…

「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器

本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后&#xff0c;屏幕上的数字会以滚动动画的形式随机变动&#xff0c;最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…

Selenium3+Python如何操作键盘

selenium操作键盘&#xff0c;需要导入Keys类&#xff1a;“from selenium.webdriver.common.keys import Keys” 调用键盘操作的快捷键的方法 &#xff1a; 单键值&#xff1a;直接传入对应的键值“element.send_keys”(快捷键的键值) 组合键&#xff1a;键值之间由逗号分隔…

从技术视角看AI在Facebook全球化中的作用

在全球化日益加深的今天&#xff0c;人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正在深刻影响全球互联网巨头的发展方向。Facebook作为全球最大的社交媒体平台之一&#xff0c;正通过AI技术突破语言、文化和技术的障碍&#xff0c;推动全球化战略的实现…

jmeter 压测常用静默参数解释应用

简介&#xff1a; JMeter静默压测&#xff08;即无界面压测&#xff09;是一种常用的性能测试方法&#xff0c;用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中&#xff0c;常用的压测参数及其解释如下&#xff1a; 一、基本…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4

一、配置 1.下载项目&#xff0c;使用 IDEA 打开&#xff0c;并配置 Nodejs 它提示我&#xff0c;需要 Node.js&#xff0c;因为 nodejs 14 的 installer 已经官网已经找不到了&#xff0c;使用 fnm 又太麻烦&#xff0c; 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

跨平台应用开发框架(4)----Qt(系统篇)

目录 1.Qt事件 1.事件来源 2.事件处理 3.按键事件 1.组合按键 4.鼠标事件 1.鼠标单击事件 2.鼠标释放事件 3.鼠标双击事件 4.鼠标移动事件 5.滚轮事件 5.定时器 1.QTimerEvent类 2.QTimer 类 3.获取系统日期及时间 6.事件分发器 7.事件过滤器 2.Qt文件 1.输入…

算法刷题Day8:BM30 二叉搜索树与双向链表

题目 牛客网题目传送门 思路 对二叉搜索树进行中序遍历&#xff0c;结果就是按序数组。因此想办法把前面遍历过的节点给记下来&#xff0c;记作pre。当遍历到某个节点node的时候&#xff0c;令前驱指向pre&#xff0c;然后让pre的后驱指向node。 代码 class TreeNode:def…

MySQL--视图

目录 1 认识视图 1.1 视图的定义 1.1 创建视图 1.2 查询 1.3 修改 1.4 删除 1.5 视图的优缺点 1.5.1 优点 1.5.2 缺点 1.6 视图的类型 1.7 视图与物化视图 2 视图检查选项 2.1 CASCADED 2.2 LOCAL 3 视图更新及作用 3.1 视图案列结合 3.1.1 屏蔽敏感数据 3.1…

基于Matlab高速动车组转臂定位橡胶节点刚度对车辆动力学影响仿真研究

本研究针对高速动车组转臂定位系统中橡胶节点的刚度对车辆动力学性能的影响进行仿真研究。随着高速铁路的发展&#xff0c;动车组的运行稳定性和舒适性成为设计和运营的核心问题&#xff0c;其中&#xff0c;转臂定位系统作为动车组悬挂系统的重要组成部分&#xff0c;其性能对…

并发专题(8)之JUC阻塞容器源码剖析

一、ArrayBlockingQueue源码剖析 ArrayBlockingQueue底层是采用数组实现的一个队列。因为底层是数据&#xff0c;一般被成为有界队列、其阻塞模式是基于ReentrantLock来实现的。 // 存数据操作 add(E),offer(E),put(E)&#xff0c;offer(E,time,unit) // add(E)&#xff1a;添加…