JS设置header,实现跨域

受浏览器的同源策略限制,JS只能请求本域内的资源,跨域资源共享(Cross-Origin Resource Sharing,CORS)是为解决Ajax技术难实现跨域而提出的一个规范,CORS把HTTP请求分为两类

第一类: 简单跨域请求
    1. 请求方法为GET、POST、HEAD,并POST的Content-Type为aplication/x-www-form-urlencoded,multipart/form-data或text/plain
    1. 对于简单跨域请求,浏览器要做的就是在HTTP请求中添加Origin,将JS脚本所在的域填充进去,向其他域的服务器请求资源。服务器端收到这个跨域请求后,根据资源权限配置,在响应头中添加Access-Control-Allow-Origin。浏览器受到响应后,查看这Access-Control-Allow-Origin,如果得到授权,JS将得到返回结果,否则浏览器忽略此次响应
第二类:复杂跨域请求(肯定会两次请求服务端)
  • 请求中出现自定义HTTP头部
    • 带预检(Preflighted)的跨域请求要浏览器在发送请求之前发送一个OPTIONS的预检请求,检测服务器是否支持真实请求进行跨域资源访问,真实请求通过Access-Control-Request-Method和Access-Control-Headers描述,此外与简单跨域请求一样
    • 服务器接收到预检后,根据资源权限配置,在响应头放入Access-Control-Allow-Origin(跨域资源请求的域)、Access-Control-Allow-Methods(请求方法)、Access-Control-Allow-Headers(请求头),另外,还可以加入Access-Control-Max-Age,允许浏览器在指定时间内,无需再发送预检,直接用本次结果进行跨域资源访问。

复杂跨域请求(带自定义header),在发送真是请求前都会先发送OPIONS请求,浏览器根据OPTIONS请求返回的结果决定是否继续发送真是请求,所以复杂请求都肯定会进行两次请求


CORS协议规定的HTTP头,用来进行浏览器发跨域资源请求时进行协商
  1. Origin:HTTP请求头,任何涉及CORS的请求都必须携带
  2. Access-Control-Request-Method:HTTP请求头,带预检(Preflighted)的跨域请求中用来表示真实请求的方法
  3. Access-Control-Request-Headers:HTTP请求头,带预检(Preflighted)的跨域请求中用来表示真实请求的自定义Header列表
  4. Access-Control-Allow-Origin:HTTP响应头,指定服务器端语序进行跨域资源访问的来源域,
    • 可以用通配符 * 来表示允许任何域的JS访问资源
    • 在响应一个携带身份信息(Credential)的HTTP请求时,不能使用通配符,必须指定具体域
  5. Access-Control-Allow-Methods:HTTP响应头,指定服务器允许进行跨域资源访问的请求方法列表,一般用在响应预检请求上
  6. Access-Control-Allow-Headers:HTTP响应头,指定服务器允许进行跨域资源访问的请求头列表,一般用在响应预检请求上
  7. Access-Control-Max-Age:HTTP响应头,用在响应预检请求上,表示是本次预检响应的有效时间
  8. access-Control-Allow-Credentials:HTTP响应头,凡是浏览器请求中携带了身份信息,而在响应头中没有返回Access0COntrol-Allow-Credentials:true的,浏览器都会忽略此次响应

你可能感兴趣的:(JS设置header,实现跨域)