首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Linux网络编程】http协议的状态码,常见请求方法以及cookie-session

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

作者头像
用户11719958
发布2025-12-30 11:59:13
发布2025-12-30 11:59:13
1060
举报

本文专栏:Linux网络编程


一,状态码

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页面,而是收到同样的数据,以文本的形式展示出来。

代码语言:javascript
复制
//实现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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,状态码
    • 重定向状态码
      • 1,永久重定向(301 Moved Permanently)
      • 2,临时重定向(302 Found)
  • 二,常见请求方法
    • 1,HTTP常见Header
    • 2,GET方法
    • 3,POST方法
    • 4,总结
  • 三,cookie-session
    • 1,cookie
    • 2,cookie问题
    • 3,session
    • 4,总结
  • 源码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档