- Published on
http状态码
- Authors
- Name
- hpoenixf
背景
HTTP状态码 是一个高频的面试问题。 一般来说,大家熟悉的状态码有:
- 404 页面不存在
- 500 服务器错误
- 301 永久重定向
- 302 临时重定向
- 200 OK
- 401 未授权
如果只是简单地答这些,可能只能拿到五六十分。为了让面试官对你的 HTTP 知识留下深刻印象,可以重点介绍以下三个状态码及相关知识:304 协商缓存、101 协议升级 和 307 HSTS 跳转。
304 协商缓存
什么是协商缓存?
协商缓存是一个基础的知识点。 当面试官问到 "什么是协商缓存?" 时,可以从以下几点展开:
浏览器缓存分类:
- 强制缓存:无需访问服务器,返回结果是
200
。 - 协商缓存:需要访问服务器,若命中缓存,返回结果是
304
。
- 强制缓存:无需访问服务器,返回结果是
强制缓存的两种方式:
- Expires:基于具体的过期时间(旧标准)。
- Cache-Control:基于时间长度,优先级更高(新标准)。
协商缓存的两种方式:
- Last-Modified:记录资源的上次修改时间。
- ETag:基于资源内容计算的唯一值,用于应对频繁修改的资源,优先级更高。
通过区分这两类缓存和优先级,可以向面试官展示你对浏览器缓存的系统理解。
101 协议升级
101 协议升级的状态码主要用于 WebSocket 和 HTTP/2 的升级。
WebSocket
- WebSocket 的特点包括:全双工通信、实时数据更新等。
HTTP/2
- HTTP/2 的优点:
- 支持单个连接的多次请求。
- 使用二进制传输。
- 压缩头部信息。
- 支持服务器推送。
面试官可能会进一步追问 HTTPS、HTTP、HTTP/2 及其前身 SPDY 的区别和优劣势,以及它们的连接建立过程。这些需要你在面试前自行深入研究。
307 HSTS 跳转
什么是 HSTS?
HSTS 全称 HTTP Strict Transport Security(HTTP严格传输安全),其功能是:
- 要求浏览器下次访问该站点时直接使用 HTTPS,而无需经过 HTTP 跳转 HTTPS 的过程。
- 避免 SSL 剥离攻击,即攻击者通过劫持 HTTP 请求,伪装为用户,破坏安全性。
使用方法
- 在服务器响应头中添加
Strict-Transport-Security
,可以设置max-age
参数。 - 示例:
Strict-Transport-Security: max-age=31536000; includeSubDomains
提到 SSL 剥离攻击时,可以补充:
- SSL 劫持攻击:通过信任第三方的安全证书,监听 HTTPS。
- 例如,代理软件可能会利用这一点进行劫持。
通过讲解 HSTS 跳转的应用场景和安全性,还可以展示你对安全相关知识的理解。
204 No Content 和预检请求
204 状态码的常见应用:预检请求
预检请求的触发条件:
简单请求:
- 请求方法为
GET
、HEAD
或POST
。 - 请求头仅使用跨域安全头。
Content-Type
为text/plain
、multipart/form-data
或application/x-www-form-urlencoded
。- 未使用
ReadableStream
对象。
- 请求方法为
非简单请求:
- 发起
OPTIONS
类型的预检请求。
- 发起
常见的跨域响应头:
Access-Control-Max-Age
:缓存预检请求的时间,避免重复发送两次请求。Access-Control-Allow-Origin
:允许跨域的域名。Access-Control-Allow-Credentials
:是否允许发送cookie
。Access-Control-Allow-Headers
:允许的请求头列表。
通过详细解释 204 和预检请求,能展现你对跨域请求机制的理解。
总结
仅仅三个状态码,就可以牵涉到如此丰富的知识。 对于 HTTP 状态码,我们不能仅仅停留在背诵状态码及对应的含义,而是要深入挖掘,借助状态码建立起自己的网络体系。
课后作业
问题: 301 和 302 有什么区别?分别适用于什么场景?
提示: 不要只记 "永久重定向" 和 "临时重定向" 的字面含义,思考它们的应用场景、缓存机制和在搜索引擎中的影响。