文章目录
认识HTTP客户端
只要能够发出http请求的程序就能称为HTTP客户端.比如如果你安装了node.js,你可以在cmd使用curl指令发出http请求.
CORS跨域请求的限制与解决
解决异源问题有两种解决方案:jsonp实现跨域请求和CORS跨域请求.
CORS就是在服务端中设置返回的数据包的头(Head):
response.writeHead(200,{'Access-Control-Allow-Origin':'*'});
如果不设置这个允许跨域的头,浏览器会把服务器返回的内容自动拦截掉.
jsonp原理就是浏览器是允许link标签,image标签script标签这些在标签上加载路径内容时是允许跨域的.
CORS跨域限制以及请求验证
CORS全称是"跨域资源共享"(Cross-originresourcesharing).
在跨域的时候默认允许跨域的方法有:GET,HEAD,POST
而其他的方法要想跨域需要进行预请求验证.
在跨域的时候默认允许跨域的请求头中Content-Type包括:
text/plain;
multipart/form-data;
application/x-www-form-urlencoded.
除了上述的三个外其他Content-Type都需要预请求验证.
在跨域的时候默认允许跨域的请求头’Accept’,‘Accept-Language’,‘Content-Language’.
如果XMLHttpRequestUpload对象没有注册任何事件监听器,那么这个对象也要经过预请求验证.
预请求就是浏览器会先发送Requst Method为OPTIONS的请求包询问服务器是否能跨域,再发送真正的请求包.
//这行代码虽然保证了任何域名都能访问,但是如果发送的请求不满足默认允许的跨域限制,比如heads为X-Test-Cors,则需要手动设置放行
response.writeHead(200,{
'Access-Control-Allow-Origin':'*',
'Access-Control-Allow-Headers':'X-Test-Cors'
});
设置允许跨域请求的最长时间1000s,即如果通过了预请求验证,则1000s之内不需要再进行预请求验证:
缓存头cache-control的含义与使用
cache-control的特性:可缓存性,包括:
public:http经过的任何地方都可以进行缓存
private:发起请求的浏览器才可以进行请求
no-cache:不可以进行缓存
cache-control的特性:缓存期限,
- max-age=< seconds >,设置缓存内容允许缓存的时间(单位:秒)
- s-maxage=< seconds >,只在代理服务器生效,且当在代理服务器中时,s-maxage的优先级最高.
- max-stale=< seconds >,即便缓存过期了,只要在max-stale的时间内,我们浏览器发起方依旧可以使用过期的缓存.这个只在发起方有效.
cache-control的特性:重新验证,
- must-revalidate:在我们设置了max-age的缓存当中,如果缓存已经过期了,必须重新发送请求获取新的缓存.
- proxy-revalidate:在我们设置了max-age的代理缓存当中,如果缓存已经过期了,必须重新发送请求获取新的缓存.而不能直接使用本地的缓存.
使用例子:
注意事项:如果设置了使用浏览器缓存,则客户端将不会通过url访问服务器.这意味着服务器更新内容后,客户端由于不访问url则内容不更新.解决方法是给url添加一个内容hash码,比如在当前例子中给script.js的内容进行hash运算,如果hash码不变就使用旧的缓存,hash码变化就使用新的缓存
缓存验证Last-Modified和Etag的使用
缓存操作流程图:
Last-Modified(上次修改时间)配合If-Modified-Since使用,对比上次修改时间以验证资源是否需要更新.
Ttag(数据签名),如果资源数据有修改那么就会生成新的数据签名.配合If-Match或者If-none-Match使用,对比资源的签名判断是否使用缓存.
cookie和session
Cookie是在服务端返回数据的时候,通过Set-Cookie这个header设置到浏览器里,保存在浏览器的内容就是Cookie,浏览器在进行下次同域的请求中就会带上这些Cookie.
Cookie的属性:
- max-age和expires设置过期时间
- Secure只在https的时候发送
- HttpOnly无法通过document.cookie访问
设置cookie过期时间:
不同域名之间它们的cookie是不能共享的.但是如果这两个域名是某个域名的二级域名(子域名),则给父域名的cookie设置domain,其子域名就能共享父域名cookie.
访问a.test.com可以收到cookie:abc=456;
我们一般会把session的id保存到cookie中
HTTP长连接
长连接概念:http请求发送的时候要先去创建tcp的连接,然后在tcp的连接上面把http请求的内容发送并接收返回内容.不关闭连接.
浏览器允许的最大tcp并发连接数为6.
如果Connection:close,则请求发出后tcp连接会关闭.
数据协商
在客户端给服务端发送一个请求时,客户端声明这个请求拿到的数据格式应该为怎么样子.
客户端在请求中通过声明Accept来规定数据类型,Accept-Encoding设置数据编码方式.Accept-Language设置返回的语言,User-Agent表示浏览器相关信息
服务端返回的Content-Type设置返回的数据格式.Content-Encoding声明数据压缩方式,Content-Language声明返回的语言.
Redirect
重定向,
重定向后url连接也会刷新.302的头才会触发跳转而200不会,因为302的语义为临时跳转.301为永久跳转.
CSP
CSP全称(Content-Security-Policy)意为内容安全策略.
作用是
- 限制资源获取
- 报告资源获取越权
default-src:限制全局