HTTP 请求报文的格式 HTTP 相应报文的格式
HTTP authentication
The general HTTP authentication framework
基本流程:
- Client 请求:浏览器请求需要认证的资源
- Server 质询:服务器返回 401 状态码(Unauthorized),同时设置 WWW-Authenticate 响应头,格式类似:WWW-Authenticate: BASIC realm="xxx"
Java shiro 框架 BasicHttpAuthenticationFilter 发出的质询响应头默认为 WWW-Authenticate: BASIC realm="application" - Client 发送凭证:浏览器针对 WWW-Authenticate 弹出用户名和密码的对话框指示用户输入。点击确认之后,浏览器发送请求给服务器,携带 Authorization: Basic
Basic 是将 username:password 进行 base64 编码 - Server 校验响应:服务器进行校验,返回 200 或者 401 状态码
之后每次访问资源都会携带 Authorization 头部
Authentication schemes- Basic
- Bearer
- …
Basic HTTP 认证方案在 RFC 7617 中定义,以 user ID/password 对作为凭据,使用 base64 进行编码
Security of basic authentication由于 user ID/password 以明文形式通过网络传递(base64 可逆),因此 basic 认证不安全。应该配合 HTTPS/TLS 一起使用。
HTTP 头部
| Header | Request | Response |
|---|---|---|
| Access-Control-Allow-Credentials | √(简单请求) | √(预检响应) |
| Access-Control-Allow-Headers | √(预检响应) | |
| Access-Control-Allow-Methods | √(预检响应) | |
| Access-Control-Allow-Origin | √(所有响应) | |
| Access-Control-Expose-Headers | √ | |
| Access-Control-Max-Age | √(预检响应) | |
| Access-Control-Request-Headers | √(预检请求) | |
| Access-Control-Request-Method | √(预检请求) |
| Header | Request | Response | 补充 |
|---|---|---|---|
| Cache-Control | √ | √ | |
| Expires | √ |
设置 Cache-Control: max-age=0 表示不缓存,但是,如果服务器关闭或失去连接,Cache-Control: max-age=0 可能会造成使用缓存。因此,使用 Cache-Control: no-store 比较安全。
Content-Disposition 百分比编码(Percent-Encoding)百分比编码用于表示数据中 1 个 8 bit 组,八位位组对应的字符在允许的集合(除了保留字符)
百分比编码的 8 bit 组被编码为字符三元组 —— 由百分号 “%” 和两个代表该八位字节数值的十六进制数字,即 %HH。例如,%20 是一个百分比编码,八位字节是 0010 0000,在 US-ASCII 中对应于空格。
URL 参数里的空格有时会是 %20 有时会是加号 (+)?
RFC1738 据说规定空格编码为 +,但我没有找到。
RFC3986 规定了百分比编码,会将空格编码为 %20
如果两个 URI 仅仅在百分比编码中使用十六进制数字的情况下才不同,那也认为是等效的。为了一致性,URI 生产者和规范化程序应该为所有百分比编码使用大写十六进制数字。
应该知道,Content-Type 可以指定 body 的编码,但是 header 的编码
Content-Disposition 兼容写法:
Content-Disposition: attachment;filename="$encoded_filename"; filename*=utf-8''$encoded_filename
encoded_filename 是指将 UTF-8 编码的文件名按照 RFC 3986 进行 urlencode 得到的
IE 支持的格式 filename=“encoded_text”(此处百分比编码)。按照 RFC 2616,引号内的部分应当直接被当作内容,尽管它看起来像编码后的字符串,但是 IE 会总动对这样的文件解码(前提是该文件名有一个没有编码的后缀名,后缀名而且是英文)
RFC 5987 正式规定 HTTP Header 多语言编码的处理方式,应当采用 MIME 扩展的 parameter*=charset'lang'value 格式,但是其中的 value 应该根据 RFC 3986 进行百分号编码。
RFC 6266 正式将 Content-Disposition 纳入 HTTP 标准,范例:
Content-Disposition: attachment; filename=“encoded_text”; filename*=utf-8’'encoded_text
HTTP 客户端
OkHttp
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), json);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.post(requestBody)
.url(url)
.header("X-Token", token).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
}
});



