【Linux网络编程】http协议的状态码,常见请求方法以及cookie-session

本文专栏:Linux网络编程

目录

一,状态码

重定向状态码

[1,永久重定向(301 Moved Permanently)](#1,永久重定向(301 Moved Permanently))

[2,临时重定向(302 Found)](#2,临时重定向(302 Found))

二,常见请求方法

1,HTTP常见Header

2,GET方法

3,POST方法

4,总结

三,cookie-session

1,cookie

2,cookie问题

3,session

4,总结

源码


一,状态码

HTTP状态码:是服务器响应客户端请求时返回的三位数字代码,用于表示请求的处理结果。

以下列举几种常见状态码的表格:

|-----|-----------------------|------------------------------------------|
| 状态码 | 含义 | 应用样例 |
| 100 | Continue | 表示请求已接受,需要继续处理。例如,上传大文件时,服务器告诉客户端可以继续上传。 |
| 200 | OK | 表示请求已被成功处理 |
| 201 | Create | 资源创建成功。例如,发布新文章,服务器返回文章创建成功的信息 |
| 204 | Not Content | 删除文章后,服务器返回"无内容"表示操作成功 |
| 301 | Moved Permanently | 网站更换域名后,自动跳转到新的域名。搜索引擎更换网站链接时使用 |
| 302 | Found或 See Other | 用户登录成功后,自动跳转到用户首页 |
| 304 | Not Midified | 浏览器缓存机制 |
| 400 | Bad Request | 填写表单时,格式不正确导致的错误 |
| 401 | Unauthorized | 访问需要登陆的页面时,未登录或者认证失败 |
| 404 | Not Found | 访问的链接不存在 |
| 500 | Internal Server Error | 服务器崩溃或数据库错误导致页面无法加载 |
| 502 | Bad Gateway | 使用代理服务器时,收到无效响应 |
| 503 | Service Unavaliable | 服务不可用(维护中或过载) |

重定向状态码

  • 关于重定向相关的状态码,可以大概分为两类,永久重定向和临时重定向。
  • 在本文中以301永久重定向和302临时重定向为例,进行讨论。
  • 简单的理解重定向,就是当我们想访问一个网址时,会跳转到其他的网址。

具体看下图:

当使用浏览器访问s1时,接收到s1发送的应答报文,发现它的状态码是30x(301或者302),就知道是需要重定向到新的网址,新的网址是报文中Location后面的内容。提取到到新的网址后,浏览器会发送二次请求访问新的网址。这就是重定向的大致过程。

1,永久重定向(301 Moved Permanently)

  • 所谓永久重定向,就是我们想访问的资源的域名发生更改,当我们使用原网址进行访问的时候,会直接跳转到新的网址下。并且浏览器会更改内部的数据,用新的网址覆盖掉原来的网址,下次访问的时候就直接使用新的网址了。
  • 永久重定向(301)的价值是用来给搜索引擎更新网站链接的。
  • 在我们使用搜索引擎访问资源的时候,其实就是获取到目标资源的域名。但是如果有些域名发生改变,就可能会导致访问失败。
  • 所以,对于搜索引擎,会不定时的向目标资源发送请求,当收到目标的应答时,如果发现报文中状态码是301,并且报文中包含Location: XXX选项。搜索引擎就会将自己内部保保存原来的域名用新的XXX域名替换掉,所以下次访问的时候,直接使用新的域名。

2,临时重定向(302 Found)

有了对永久重定向的理解,临时重定向就很简单。当我们访问一个网址时,会跳转到新的网址,最常见的就是我们用户的登录操作,当我们登录完成后,就会跳转到用户首页。而下次访问时,还是需要先访问登录页面。

二,常见请求方法

最常见的两种方法:GET和POST

  • POST:上传资源,比如登录操作,需要上传我们的用户名和密码。
  • GET:获取资源,获取网页,图片,视频等等各种资源。同时也可以上传资源。

1,HTTP常见Header

Content-Type:数据类型,就是正文部分的内容是什么类型的,html,css或者是纯文本等等类型

Content-Length:正文部分的长度

Host:客户端告诉服务器,所请求的资源在哪个主机的哪个端口上。

User-Agent:声明用户的操作系统的浏览器版本信息

refer:当前页面是从哪个页面跳转过来的

Location:在上面状态码部分提到过。告诉客户端接下来要去哪里访问。

Cookie:这个 内容在本文下面讲解。

其中需要注意的是Content-Type数据类型,当服务器端给客户端返回数据时,需要带上这个属性,告诉浏览器该怎么解释(其实也可以不用带了,因为现在的浏览器已经很强大了,可以解析出来)。关于Content-Type,有一张对照表:

链接:HTTP Content-type 对照表 | content type

比如如果正问部分为html格式,那么报头中应该包含 Content-Type:text/html

2,GET方法

  • 方法部分需要配合代码才好理解。这里我写了一个简单的http服务器(源码在文章末尾),以该http服务器为例子来理解GET方法。
  • 在服务器中设置了4个html网页:首页,登录页面,注册页面,404页面。
  • 其中首页可以跳转到登录页面和注册页面。

当我们想要进入登录页面,进行登陆时会出现如下问题:

此时的uri内容是:

同时登录页面的html内容是:

可以得出结论:**uri中?之前的部分表示http提供的服务,?之后的内容表示用户输入的参数。**只不过现在我们的http服务器还没有实现这个服务,所以最后会进入404页面。

  1. 之前我们访问网页都是在访问呢静态资源,图片视频什么的。而现在需要实现login服务,也就是让我们的服务器实现动他交互的功能。
  2. 实现方法:在对浏览器发送过来的uri进行解析时,判断是否带有问号,如果带有问号,表示需要进行动态交互,然后提取服务名(也就是问号之前的参数),再提取用户上传的参数(?之后的内容)

当我们实现好后,添加一个登录的操作,这里只是简单的将用户输入的数据以纯文本的形式发送回去,将来我们继续登陆后,不会访问404页面,而是收到同样的数据,以文本的形式展示出来。

复制代码
//实现login一个服务
void Login(HttpRequest& req,HttpResponse& resp)
{
    //构建resp的内容
    //这里直接将req的内容以纯文本的形式发送回去
    std::string text="hello :"+req.Args();

    resp.setCode(200);
    resp.setHeader("Content-Type","text/plain");
    resp.setHeader("Content-Length",std::to_string(text.size()));
    resp.setText(text);
}

在http协议基础之上,我们新增了一个Login服务,我们将来就可以使用域名+服务名来访问对应的服务,这就相当于http给我们提供了一种微服务的接口。这种风格的网络接口称为RESTful风格的网络接口。所以未来我们还可以新增各种服务接口。比如注册接口,统计在线人数接口等等。

最后,其实我们早就知道了,GET方法的提参是通过uri提交的。

3,POST方法

POST方法,我们看一段正文就可以知道了。

上面的报文是通过POST方法进行登录,可以发现再提交参数的时候,是将参数增加到正文部分的

4,总结

GET方法:

  1. 获取静态资源或者网页
  2. 提交参数,以uri形式提交
  3. GET提交参数一般不建议太长,因为uri长度是有限的
  4. GET传参,参数是会显示出来的。

POST方法:

  1. 提交参数,以正文部分参数
  2. 参数不会回显,相对私密

不管是GET还是POST,都是明文传送,可以抓取,是不安全的。

要做到真正的安全,必须要把报文进行加密,就要用到https协议。

三,cookie-session

1,cookie

HTTP协议是无连接,无状态的协议,即每次请求都需要建立新的连接,且服务器不会保存客户端的状态信息。

  1. HTTP底层是基于tcp的,所谓无连接,是指HTTP不管通信部分,只负责接受请求和发送应答的事情,连接是底层tcp管理的。所以说HTTP是无连接的。
  2. 无状态,是指当我们访问服务器时,服务器不会记录我们状态的信息。比如我们访问某个网页一次,就给我返回该网页一次。所以说是无状态的。(但实际上,为了提高效率,当我们访问一次后,浏览器会记录数据,下次访问时直接找浏览器拿即可)

有了上面的理解,看下面的一个例子:

如下图所示,当我们项访问某个网站资源时,需要登录认证 。

  1. 第一次登录认证成功后,会给我们返回网站首页。
  2. 拿到网站首页后,当我们想要访问某个资源时,就需要再次进行登录认证,因为HTTP是无状态的,他不会记录当前你这个用户是否登录过,所以需要再次登录认证。
  3. 那么从今往后,你每访问一个资源,就需要登录认证一次,这对用户的肯定不友好。

所以,为了解决上述问题,就引入了cookie功能

在进行完一次认证操作后,服务器返回应答,应答报文中会包含Set-Cookie属性,记录用户输入的内容。浏览器检测到Set-Cookie属性,会将该部分内容保存下来,形成一个cookie文件,下次访问的时候直接携带该cookie文件,不需要再次认证了。

验证cookie的存在,以登录bilibili为例:

2,cookie问题

如果我们的电脑被植入了木马程序,那么黑客就可以获取到我们浏览器内的cookie文件。此时在他自己的电脑上访问同样的网站,使用我们的cookie,那么黑客就可以以我们的身份登录,访问服务器了。这样我们的账号就会被盗取,同时cookie中记录的私密数据(用户名,用户密码等等)也会泄漏。所以说,单纯使用cookie是不安全的。

总结一下,会存在两个问题:用户的账号丢失,用户的私密信息泄漏。

为了一定程度的解决该问题,就引入了session。

3,session

为了一定程度的解决上述问题,就引入了session

  1. 当我们登录认证成功后,我们输入的数据(用户名+密码),服务器端会生成一个session对象,来保存我们的密码和数据。然后给浏览器端返回一个session_id。下次访问时,直接携带cookie,cookie中保存了session_id,服务器端检查session_id是否存在即可。这样将用户的信息保存在服务器端,不保存在客户端,就解决了用户私密信息泄漏的问题。
  2. 而对于账号丢失的问题,不能完全解决,只能采取一定的辅助方案,比如溯源ip,地址的变更等等。比如,上次登录是在北京,5秒后再次登录,ip变为云南了,此时服务器就会检测到异常,将保存的session对象释放掉,要求用户重新登录,重新输入用户名和密码。就在一定程度上解决了这些问题。

4,总结

cookie和session:是用来负责会话管理与会话保持的。是HTTP的附加功能,不严格属于HTTP。

源码

myhttp2 · 小鬼/linux学习 - 码云 - 开源中国https://gitee.com/wang-junyanxx/linux-learning/tree/master/myhttp2

相关推荐
xiaolingting2 小时前
HTTP 快速解析
网络·网络协议·http·协商缓存·文件传输·206
望获linux3 小时前
北京亦庄机器人马拉松:人机共跑背后的技术突破与产业启示
linux·人工智能·机器人·操作系统·开源软件·rtos·具身智能
张槊哲4 小时前
字符和编码(python)
linux·数据库·python
herinspace7 小时前
管家婆易指开单如何设置零售开单
运维·服务器·数据库·软件工程·sass·零售
小镇敲码人7 小时前
【网络层】之IP协议
服务器·网络·tcp/ip
IT阳晨。8 小时前
【嵌入式Linux】基于ARM-Linux的zero2平台的智慧楼宇管理系统项目
linux·arm开发
_清风来叙8 小时前
【Linux】Linux内核模块开发
linux·arm开发
于齐龙8 小时前
pip 常用命令及配置
linux·python·pip
闻道且行之8 小时前
Paddle Serving|部署一个自己的OCR识别服务器
服务器·ocr·paddle
让子弹飞028 小时前
24.Linux中RTC的驱动实验_csdn
linux·ubuntu·stm32mp157·驱动的分离和分层·rtc时间