跳到主要内容

基本概念

HTTP 超文本传输协议 应用层协议,基于 TCP(一般来说 请求 响应 简单可扩展 无状态

协议发展 HTTP/0.9 请求 GET,响应只有 HTML 文档 HTTP/1.0 增加了 Header,有状态码,支持多种文档类型 HTTP/1.1 标准协议:链接复用(长连接),缓存,内容协商 HTTP/2 二进制协议,压缩 header,服务器推送

OPTIONS 预检

是指在跨域请求时候,浏览器会首先发送一个预检请求,以确定实际请求可否被服务器所接受。是 CORS 规范中一部分。可以提高程序的安全性 在跨域请求中,如果请求的方法不是简单请求(例如,使用 PUT 或 DELETE 方法),或者请求头包含了一些自定义头部,那么浏览器会发送一个 OPTIONS 请求(预检请求)到服务器端,以获取一些必要的信息,包括:

  • 请求的方法是否被服务器所允许;
  • 请求头中是否包含了某些不支持的内容类型;
  • 是否需要在请求中使用凭据(例如,cookies、HTTP 认证等)。 服务器收到预检请求后,会根据请求中的 Origin 字段来确定是否接受请求,如果接受,则在响应头中设置一些额外的信息,包括:
  • Access-Control-Allow-Origin:指定可以接受请求的源地址;
  • Access-Control-Allow-Methods:指定可以接受的请求方法;
  • Access-Control-Allow-Headers:指定可以接受的请求头;
  • Access-Control-Allow-Credentials:指定是否可以在请求中使用凭据(主要是 cookie 浏览器收到预检请求的响应后,如果服务器允许该跨域请求,则会发送实际的请求。如果服务器拒绝该跨域请求,浏览器会在控制台中显示相应的错误信息。需要注意的是,预检请求会增加额外的网络开销,因此应该尽量避免在跨域请求中使用不必要的自定义请求头或不常用的请求方法,以减少预检请求的发送次数

转义 encodeURIComponent

encodeURI 负责转义整个 URI,但对#&/等不一定在参数中出现的不会转义 恢复用 decodeXXXXX

为了避免服务器收到不可预知的请求,对任何用户输入的作为 URI 部分的内容你都需要用 encodeURIComponent 进行转义。比如,一个用户可能会输入"Thyme &time=again"作为 comment 变量的一部分。如果不使用 encodeURIComponent 对此内容进行转义,服务器得到的将是 comment=Thyme%20&time=again。请注意,"&"符号和"="符号产生了一个新的键值对,所以服务器得到两个键值对(一个键值对是 comment=Thyme,另一个则是 time=again),而不是一个键值对。 对于 application/x-www-form-urlencoded (POST) 这种数据方式,空格需要被替换成 '+',所以通常使用 encodeURIComponent 的时候还会把 "%20" 替换为 "+"。