1) 请求组成
请求由三部分组成
-
请求行
-
请求头
-
请求体
2) 请求方式与数据格式
get 请求示例
GET /test2?name=%E5%BC%A0&age=20 HTTP/1.1
Host: localhost
-
%E5%BC%A0 是【张】经过 URL 编码后的结果
转换成16进制
经过 URL 编码后的结果
post 请求示例
POST /test2 HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 21
name=%E5%BC%A0&age=18
application/x-www-form-urlencoed 格式细节:
-
参数分成名字和值,中间用 = 分隔
-
多个参数使用 & 进行分隔
-
【张】等特殊字符需要用 encodeURIComponent() 编码为 【%E5%BC%A0】后才能发送
json 请求示例
POST /test3 HTTP/1.1
Host: localhost
Content-Type: application/json
Content-Length: 25
{"name":"zhang","age":18}
json 对象格式
{"属性名":属性值}
其中属性值可以是
字符串 ""
数字
true, false
null
对象
数组
json 数组格式
[元素1, 元素2, ...]
multipart 请求示例
文件上传的时候见到的,boundary 分隔符的定义,因为是多部分组成的
POST /test2 HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=123
Content-Length: 125
--123
Content-Disposition: form-data; name="name"
lisi
--123
Content-Disposition: form-data; name="age"
30
--123--
-
boundary=123 用来定义分隔符
-
起始分隔符是
--分隔符
-
结束分隔符是
--分隔符--
跟上面的125 不一样,因为在多部分的数据中每段数据有个/n的回车,所以要把每一段的 回车计算进去,+9 所以是 116+9。
数据格式小结
客户端发送
-
编码
-
application/x-www-form-urlencoded :url 编码
-
application/json:utf-8 编码
-
multipart/form-data:每部分编码可以不同
-
-
表单只支持以 application/x-www-form-urlencoded 和 multipart/form-data 格式发送数据
-
文件上传需要用 multipart/form-data 格式
-
js 代码可以支持任意格式发送数据
服务端接收
-
对 application/x-www-form-urlencoded 和 multipart/form-data 格式的数据,Spring 接收方式是统一的,只需要用 java bean 的属性名对应请求参数名即可
-
对于 applicaiton/json 格式的数据,Spring 接收需要使用 @RequestBody 注解 + java bean 的方式
3) session 原理
Http 无状态,有会话
-
无状态是指,请求之间相互独立,第一次请求的数据,第二次请求不能重用
-
有会话是指,客户端和服务端都有相应的技术,可以暂存数据,让数据在请求间共享
服务端使用了 session 技术来暂存数据
存
GET /s1?name=zhang HTTP/1.1
Host: localhost
取
GET /s2 HTTP/1.1
Host: localhost
Cookie: JSESSIONID=560FA845D02AE09B176E1BC5D9816A5D
4) jwt 原理
生成 token
GET /j1?name=zhang&pass=123 HTTP/1.1
Host: localhost
校验 token
GET /j2 HTTP/1.1
Host: localhost
Authorization: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiJ9._1-P_TLlzQPb1_lCyGwplMZaKQ8Mcw_plBbYPZ3OX28
对token进行反解码,由于服务器生成,所以token不可以放敏感数据
关键在于后面的数字签名,让token无法篡改,所以具有一定的安全性
将用户修改成admin 校验失败