zoukankan      html  css  js  c++  java
  • 对 js 高程 Preflighted Reqeusts 的理解

    看JS高程遇到 Preflighted Reqeusts不大理解,遂百度下:

    转自:http://todoit.me/ajax-preflight/

    最近在做一个 VUE 的项目的时候, 和后端的小伙伴对接口, 想方便开发, 于是要求后端的小伙伴在所有的接口都加上跨域的许可 (Access-Control-Allow-Origin)

    (后来事实证明这不是一个很好的解决方案, 因为 vue-cli 提供了 proxy-table 作为 AJAX请求的代理, 只需要配置一下就好, 编译上线也不要改动代码)

    however, 经过这次折腾, 学到了preflight request的姿势

    preflight request 预请求

    当你在跨域的情况下发送一个非简单请求时:

    浏览器预先发送一个 OPTIONS 请求, 来查明这个跨站请求对于目的站点是不是安全可接受的 当服务端对 OPTIONS 请求返回表示支持跨域请求的 Origin, method, headers 时, 浏览器才会发送你所需要的真正的跨域请求

    什么是简单请求
    • 只使用 GET, HEAD 或者 POST 请求方法。如果使用 POST 向服务器端传送数据,则数据类型 (Content-Type) 只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一种。
    • 不包含自定义请求头
    举个栗子
    1. 发送预请求

    我实际向服务端提交一个跨域的POST 请求, 请求的 Content-Type 是application/json, 这是一个非简单请求, 所以浏览器会发送一个 method 为 OPTIONS的预请求, 到服务端查询是否支持该跨域请求

    请求信息:

    Request URL: http://stu.dev/post  
    Request Method:OPTIONS  
    Access-Control-Request-Headers:content-type  
    Access-Control-Request-Method:POST  
    Origin:http://localhost:8080  
    

    OK, 注意后面三行

    Access-Control-Request-Method: 在发出预检请求时带有这个头信息, 告诉服务器在实际请求时会使用的请求方式

    Access-Control-Request-Headers: 在发出预检请求时带有这个头信息, 告诉服务器在实际请求时会携带的自定义头信息. 如有多个, 可以用逗号分开.

    Origin: 表明发送请求或者预请求的域

    2. 服务端响应预请求
    Access-Control-Allow-Headers:Content-Type  
    Access-Control-Allow-Origin:*  
    Allow:GET,HEAD,POST  
    

    服务端需要对预请求里对应的三个头进行响应:

    Access-Control-Allow-Headers:Content-Type: 表明服务端支持该跨域请求(实际请求)的请求头, 对应预请求里的Access-Control-Request-Headers:content-type

    Access-Control-Allow-Origin:*: 表明服务端支持跨域响应的域, 对应对应预请求里的Origin

    Allow:GET,HEAD,POST 表明服务端支持该跨域请求的 Method

    预请求的所有跨域头得到允许以后(及以上三个请求头一一对应), 浏览器才会发送实际请求, 所以服务端要根据预请求响应这三个请求头

    3. 发送实际请求.
    4. 响应实际请求.
    最后
    解决办法

    如果你的跨域请求失败, 原因是预请求得不到正确响应

    1. 检查预请求, (那个 options 请求)的三个请求头Origin, Access-Control-Allow-Headers, Access-Control-Request-Method

    2. 服务端分别加上

      Access-Control-Allow-Origin: <预请求的 Origin 内容 | * >,

      Access-Control-Request-Headers:<预请求的Access-Control-Request-Headers内容>

      Allow:<预请求的Access-Control-Request-Method的内容>

      这几个响应头

    over.

    案例参考:

    打开http://www.uscfinvestments.com/usci,查看XHR中的https://cssecure.alpsinc.com/api/v1/dailyprice/usci的请求

    参考

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/AccesscontrolCORS

    https://www.w3.org/TR/cors/#resource-preflight-requests

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Server-SideAccessControl#预请求

  • 相关阅读:
    [Leetcode] Maximum Gap
    [Leetcode] Reverse Integer
    [Leetcode] Pow(x, n)
    Theano2.1.21-基础知识之theano中多核的支持
    Theano2.1.3-基础知识之更多的例子
    Theano2.1.17-基础知识之剖析theano的函数
    Theano2.1.16-基础知识之调试:常见的问题解答
    Theano2.1.15-基础知识之theano如何处理shapre信息
    Theano2.1.14-基础知识之理解为了速度和正确性的内存别名
    Theano2.1.13-基础知识之PyCUDA、CUDAMat、Gnumpy的兼容
  • 原文地址:https://www.cnblogs.com/xianshenglu/p/8401134.html
Copyright © 2011-2022 走看看