栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HTTP 协议笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HTTP 协议笔记

HTTP 报文
HTTP 请求报文的格式

HTTP 相应报文的格式

 

HTTP authentication
The general HTTP authentication framework

基本流程:

  1. Client 请求:浏览器请求需要认证的资源
  2. Server 质询:服务器返回 401 状态码(Unauthorized),同时设置 WWW-Authenticate 响应头,格式类似:WWW-Authenticate: BASIC realm="xxx"
    Java shiro 框架 BasicHttpAuthenticationFilter 发出的质询响应头默认为 WWW-Authenticate: BASIC realm="application"
  3. Client 发送凭证:浏览器针对 WWW-Authenticate 弹出用户名和密码的对话框指示用户输入。点击确认之后,浏览器发送请求给服务器,携带 Authorization: Basic
    Basic 是将 username:password 进行 base64 编码
  4. Server 校验响应:服务器进行校验,返回 200 或者 401 状态码

之后每次访问资源都会携带 Authorization 头部

Authentication schemes
  • Basic
  • Bearer
Basic authentication scheme

Basic HTTP 认证方案在 RFC 7617 中定义,以 user ID/password 对作为凭据,使用 base64 进行编码

Security of basic authentication

由于 user ID/password 以明文形式通过网络传递(base64 可逆),因此 basic 认证不安全。应该配合 HTTPS/TLS 一起使用。

 

HTTP 头部
HeaderRequestResponse
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√(预检请求)
HeaderRequestResponse补充
Cache-Control
Expires
Cache-Control

设置 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 {
    }
});
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/301201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号