请求、响应、cookie和跨域

60 阅读2分钟

请求和响应

如何发送请求

  1. 使用浏览器地址栏,只能get
  2. 使用form标签,只能get和post(用得不多
  3. 使用AJAX
  4. 使用命令行工具 curl(Window 10+、macOS、Linux 自带

请求内容

请求行

GET / HTTP/1.1 get后加上路径,路径以 / 开头,后面追加 http/版本号,请求方法除了get还有 post, put, patch, options, trace

请求头

Accept: text/html... //请求根目录,返回html

Content-Type: application/json //上传内容格式

Host: www.baidu.com //访问域名

回车(间隔符号

消息体(任意内容

如何返回响应

  1. 使用 Node.js, Python, Java, Go 等任意后台语言

响应内容:

Cookie

即服务器通过 Set-Cookie 响应头下发给浏览器的一段字符串

下发后,未来的一段时间内,浏览器 向 同域名 或 子域名 发送请求时,必须通过请求头 Cookie 带上这段字符串,主要用于识别用户身份

登录流程

  1. 用户填写登录凭据
  2. 服务器检查凭据的有效性
  3. 如果有效 则通过 Set-Cookie 给用户下发一串随机数(Cookie),无效则提示密码错误
  4. 服务器将随机数(Cookie)和对应的 user_id 记下来,表示用户已登录
  5. 用户后续的请求全都会带上随机数,服务器皆放行

存在内存或硬盘,这份数据被叫做 session

session 是真实的登录信息 在服务器的内存或硬盘上,cookie 是随机数 在浏览器,

同源策略与跨域

浏览器的一个功能,为了保护用户数据,每个网站只能访问自己的数据

协议,主机名(域名或IP),端口完全一直的两个 url,被称为同源

想要突破浏览器的同源限制,就是跨域

跨域有三种方法,1.CORS 2.JSONP 3.反向代理,三种都需要后端参与

CORS——Cross Origin Resource Sharing

跨域资源共享,由后端在响应头添加

假设 a.com:1234 想发送请求给 b.com:4321

如果是简单请求(详见MDN),在响应头设置 Access-Control-Allow-Origin:b.com:4321 即可

如果是复杂请求(详见MDN),则见 MDN 操作

JSONP

//略

/* b.com代码 */ if(path === '/data'){ reponse.statusCode = 200 reponse.setHeader('Content-Type', 'text/javascript;charset=utf-8') //把数据格式改成JS reponse.write(`window.xxx({"name" : "Gorge"}) //此处,{"name":"Gorge"}为JSON 两边的是Padding reponse.end() }


缺点:只能发 get 请求,无法定向分享

## 反向代理

一般通过 nginx 配置实现

假设 a.com:1234 想把 GET /data 共享给 b.com:4321

1.  b.com 后端提供一个 /data(Nginx 配置如下)

location /data { proxy_pass a.com:8888; }


2.  b.com 前端通过 AJAX 访问 b.com/data
2.  b.com/data 向 a.com/data 发请求,得到响应之后给 b.com 的前端