http 知识整理

1. 启发式缓存

在不设置cache-control/expires的情况下,浏览器不会默认进入协商缓存。而是根据Date/LastModified去自动计算出合适的缓存时间。
计算方式为:(Date - LastModified) * n
n:LM-Factor,处于[0,1]之间

2. 强制缓存 ---- 再次请求时无需向浏览器发送请求。

Cache-control: 具有强大的缓存控制能力;
常用值:no-cache: 每次请求需要校验服务器资源的新鲜度
max-age=31536000: 浏览器在一年内都不需要像服务器请求资源。
Expires: 使用绝对时间。

3. 协商缓存 ---- 再次请求时需要向服务器校验新鲜度。若新鲜,返回304,从浏览器获取。

Last-Modified/If-Modified-Since: 匹配响应头的Last-Modified与请求头的If-Modified-Since是否一致。
Etag/If-None-Match: 匹配响应头中的Etag与请求头中的If-None-Match是否一致。

4. Last-Modified 局限性

a. 时间精度只有秒级别,但某文件在一秒内可以被更改n次。
b. 某一文件经过修改后但内容并未发生改变。(比如添加一行再删除一行)

5. Etag — Last-Modified的‘补丁’,精度更高。

针对文件内容进行hash计算,得到的hash值作为Etag的值。

6. 图片防盗链

a. Referer: 标识网页来源地址。
原理:通过判断referer来验证访问是否合法,不合法则返回403,禁止访问图片。
b. 给图片添加水印。

7. 防止图片防盗链

不发referer请求头,两种方式:
a. 直接浏览器输入url,自动不会携带referer。
b.Referrer-Policy设置不发送Referer请求头: Referrer-Policy: no-referrer

8. User-Agent

标识客户端,简称UA.
通过该头可获取到所用浏览器、浏览器版本、操作系统等信息。

9. 浏览器如何判断PC/Mobile

推荐库:https://github.com/kaimallea/isMobile

10. 项目缓存策略

对带有hash值的文件资源设置一年强缓存;(当源文件内容发生变更时,hash值发生改变,生成新的可永久缓存的资源地址,此时打包会遍历文件,更新缓存地址并清除掉旧缓存)。
对不带hash值得文件资源一定要显式的配置****Cache-Control: no-cache
如果不配置,就会触发启发式缓存,从而造成应用升级但是刷新不生效的问题。
tips: 不设置强缓存的时候,默认进入的是启发式缓存,而不是协商缓存)

11. No-cache/No-store 区别

no-cache: 可以在客户端存储资源,每次都必须去服务端做新鲜度校验,以此来决定从服务端获取新资源还是从客户端获取缓存。(协商缓存)
no-store:永远不在客户端存储资源,每次都去原始服务器获取资源。(彻底不缓存)

12. Max-age = 0,代表什么?

max-age=0 暗示内容立即被认为是陈旧的(并且必须重新获取),这实际上与 Cache-Control: no-cache 相同。
no-cachemax-age=0作为请求头,二者均会重新向服务器发起请求,哪怕该请求已被缓存。

13. 预检请求?

当一个请求跨域且不是简单请求时,就会发起一个OPTIONS请求,被称为预检请求。

预检请求用于检查服务器是否支持CORS, 以便确认最终是否发送正常请求,由于它通过响应头进行判断,无需 Body,因此关于 OPTIONS 请求的状态码可选择 204 No Content

如果预检请求失败,不允许跨域,则该复杂请求则会在浏览器控制台看到 CORS Error,并将该请求标记为红色。

在 Chrome 浏览器控制台中,跨域复杂请求旁,有 pre-flight 链 接指向该请求的预检请求

预检请求一般会携带以下三个请求头,用以向服务器咨询是否支持该跨域请求:

是否支持 POST 方法
Access-Control-Request-Method: POST

是否支持携带 content-type 请求头
Access-Control-Request-Headers: content-type

来自域名 https://shanyue.tech 的跨域请求
Origin: https://shanyue.tech
同时回复响应头,用以确认是否支持CORS.

允许跨域的头部
Access-Control-Allow-Headers: Content-Type,Content-Length,Accept-Encoding,X-CSRF-Token,accept,origin,Cache-Control,X-Requested-With,X-USE-PPE,X-TT-ENV

允许跨域的方法
Access-Control-Allow-Methods: POST, OPTIONS, GET

允许跨域的域名
Access-Control-Allow-Origin: *

OPTIONS 预检请求的缓存时间,即在 600s 内不会再次发送 OPTIONS 请求
Access-Control-Max-Age: 600

是否允许携带权限信息,比如 cookie 一类
Access-Control-Allow-Credentials: true

14. 简单请求

满足以下条件的即为简单请求:
1>. Method: 请求方法是GET,POST以及HEAD
2>. Header: 请求头是conten-Type且其值为:Accept-Language、Content-Language.
3>. Content-Type: 请求类型是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain

15. 非简单请求

一般需要开发者主动构造,常见的简单请求有:content-type: application/json及Authorization:。

16. 设置默认携带cookie。(不设置则不携带)

fetch 发送请求时配置 credentials: include
server 响应时,配置响应头 access-control-allow-credentials: true
另外,无法向配置 **access-control-allow-origin: *** 的域名发送 Cookie,否则报错
在这里插入图片描述

17. Fetch credentials

credentials指在使用fetch发送请求时是否应当发送cookie.
Omit: 从不发送
Same-origin: 同源时发送,跨域则不发送。
Include: 同源与跨域都会发送cookie。

18. Access-Control-Allow-Origin

取值为: | *
其中,origin代表指定特定域名;* 代表所有域名。

19. 如何设置多个域名?

根据Origin请求头来设置响应头:Access-Control-Allow-Origin.
a.总是设置 Vary: Origin,避免 CDN 缓存破坏 CORS 配置
b.如果请求头不带有 Origin,证明未跨域,则不作任何处理
c.如果请求头带有 Origin,证明浏览器访问跨域,根据 Origin 设置相应的 Access-Control-Allow-Origin:

20. Vary: Origin,代表为不同的origin缓存不同的资源。

使用语法为:Vary:<header-name>,<header-name>, …
可理解为用以缓存的 key 值,常用于内容协商,因为内容协商往往会根据 Accept/Accept-Language 返回不同的资源。

21. 同域名浏览器会自动携带上cookie。

22. Cookie的属性 — 可跨域但不能跨站。

  • Domain: 为Cookie指定的域名。
  • Path: 为Cookie指定的路径
  • Expire/Max-age: Cookie的缓存时间。
  • HttpOnly:无法通过JS修改Cookie,但可以再浏览器看到其值。(可避免XSS攻击–跨站脚本攻击:通过注入脚本的方式获取到cookie,避免XSS攻击最有效的办法是CSP(内容安全策略),也是通过http配置.)
  • Secure: 仅能通过HTTPS协议传递
  • SameSite: 跨站点Cookie发送策略 (可用于防止CSRF攻击)

23. CSRF(cross-site request forgery)

跨站请求伪造,通过恶意引导用户一次点击劫持cookie及逆行攻击。

24. SameSite的值?

None: 任何情况下都会向第三方网站请求发送Cookie.
Lax: 只有导航到第三方网站的Get链接会发送cookie,而跨域的图片iframe,fetch请求,form Post表单等都不会发送cookie.
Strict: 任何情况下都不会向第三方网站请求发送cookie。

25. 状态码

100: 服务器检查请求头是否有问题。没问题返回100,有问题返回417.
101: 表示正在切换协议,如从http切换到websocket.
103: 提前声明对某些资源的优化提示
preload: 预加载。
preconnect: 提前建立链接。
201: 一般用以POST请求,代表服务器资源创建成功。
206: 当客户端指定 Range 范围请求头时,服务器端将会返回部分资源。当请求音视频资源体积过大时,一般使用 206 较多
401:当没有权限的用户请求需要带有权限的资源时,会返回 401,此时携带正确的权限凭证再试一次可以解决问题
413: Request Body过大,服务器处理不过来
429: 超过某一个 API 的 Rate Limit 规则,会被限流.(不同的接口,有不同的限流规则)

26. 502跟504区别

502 Bad Gateway: 一般表现为你自己写的应用层服务(Java/Go/PHP)挂了,或者网关指定的上游服务直接指错了地址,网关层无法接收到响应

  • 504 Gateway Timeout: 一般表现为应用层服务 (Upstream) 超时,超过了 Gatway 配置的 Timeout,如查库操作耗时三分钟,超过了 Nginx 配置的超时时间

扩展

1. etag的生成策略

(详见参考:https://blog.csdn.net/weixin_42989576/article/details/123695991)

静态文件(如css,js,图片等):文件大小的16进制+修改时间

字符串或Buffer:字符串/Buffer长度的16进制+对应hash值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种高级编程语言,被广泛用于各种领域的软件开发、数据分析、人工智能和科学计算等。它有许多不同的知识点,下面是一些常见的Python知识整理: 1. 基本语法:包括变量、数据类型、运算符、条件语句、循环语句等。 2. 函数:定义函数、参数传递、返回值、作用域等。 3. 模块与包:导入模块、使用第三方库、创建和使用自定义包等。 4. 文件操作:读取和写入文件、文件路径操作、异常处理等。 5. 数据结构:列表、元组、字典、集合等。 6. 面向对象编程:类、对象、继承、多态等。 7. 异常处理:捕获和处理异常、使用try-except语句等。 8. 正则表达式:匹配模式、替换字符串等。 9. 迭代器与生成器:迭代对象、生成器函数、yield关键字等。 10. 装饰器:函数装饰器、类装饰器等。 11. 并发编程:多线程、多进程、协程等。 12. 文件操作:读写文件、文件路径操作、文件压缩和解压缩等。 13. 数据库操作:连接数据库、执行SQL语句、操作数据库表等。 14. 网络编程:创建TCP/UDP服务器和客户端、Socket编程等。 15. Web开发:使用框架如Django和Flask进行Web应用开发、处理HTTP请求和响应等。 16. 数据分析与可视化:使用NumPy、Pandas和Matplotlib进行数据处理和可视化。 17. 机器学习:使用Scikit-learn库进行机器学习模型的建立和训练。 18. 数据爬取:使用BeautifulSoup和Scrapy进行网页爬取和数据提取。 19. 测试与调试:编写单元测试、调试程序等。 20. 性能优化:代码优化、内存管理、并行计算等。 这只是Python知识点的一小部分,Python是一门非常丰富的语言,还有很多其他的知识点值得深入学习和探索。 相关问题: 1. Python为什么在数据分析和科学计算领域中广泛使用? 2. Python中的模块和包有什么区别?如何导入和使用它们? 3. Python中的异常处理是怎样工作的?为什么它在编程中很重要? 4. Python中的迭代器和生成器有什么区别?如何使用它们来提高代码效率? 5. Python中的装饰器是什么?如何使用它们来增强函数或类的功能? 6. Python的多线程和多进程有什么区别?如何在程序中使用它们? 7. 在Python中如何进行文件的读写操作?如何处理文件路径和异常? 8. 如何使用Python进行数据库操作?如何连接数据库和执行SQL语句? 9. Python中如何进行网络编程?如何创建和使用TCP/UDP服务器和客户端? 10. 如何使用Python进行Web开发?如何使用框架来创建Web应用? 11. Python中如何进行数据爬取和数据处理?如何使用相关的库? 12. Python中如何进行测试和调试?如何编写单元测试和调试程序? 13. 如何使用Python进行性能优化?如何优化代码和内存管理? 14. Python在人工智能领域中有哪些常用的库和框架?如何使用它们来构建机器学习模型?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值