HTTP Header
- 我们知道
HTTP
协议中定义了Header
,是一组KV集合。 - 在请求时可以把信息放在
Header
中带给服务端,在响应时也可以利用Header
输出部分信息。
Header使用场景
- 常用场景包括在
Header
中标明请求的Content-Type
,Accept-Language
,甚至请求的Cookie
信息也是在Header
中传输。 - 特别地,在
Restful Api
中,我们经常将登录认证信息(Token
)放在请求的Authorization
里,服务端解析认证信息来判断登录是否有效。
浏览器环境下的限制
- 今天遇到一个问题,项目定义的
Rest
认证协议中,用到了Header
里的Authorization
和Date
字段。 - 这些接口一般情况是由服务端发起调用,并没有任何问题。
- 但是最近我在写一个web版的工具,想在浏览器环境下构造请求访问这些接口,但是发现请求的
Header
中无法写入我指定的Date
值。 - 查阅相关资料才发现,原来在web环境下,为了一些安全原因,浏览器会限制手动构造的
HTTP
请求中的Header
内容。其中包括:
- accept-charset
- accept-encoding
- access-control-request-headers
- access-control-request-method
- connection
- content-length
- content-transfer-encoding
- cookie
- cookie2
- date
- expect
- host
- keep-alive
- origin
- referer
- te
- trailer
- transfer-encoding
- upgrade
- via
解决和结论
- 既然在浏览器层面限制了在,我也只好绕过这个问题。具体方案有二:
- 修改服务端认证协议,兼容另一个
Header
字段来当作Date
。 - WEB前端请求本地服务端,本地服务端中转接口再请求
Rest
服务。
- 修改服务端认证协议,兼容另一个
- 在定义私有协议的时候,最好事先了解一下大环境下的通用协议,避免与之产生冲突。