• CORS(Cross-origin resource sharing) “跨域资源共享”


    CORS与JSONP的比较

    在出现CORS标准之前, 我们还只能通过jsonp的形式去向“跨源”服务器去发送 XMLHttpRequest 请求,这种方式吃力不讨好,在请求方与接收方都需要做处理,而且请求的方式仅仅局限于GET。

    CORS概念

    支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应。其本质是设置响应头,使得浏览器允许跨域请求。

    CORS中的跨域请求分为简单请求与非简单请求

    简单请求

    满足以下条件的就是简单请求

    (1) 请求方法是以下三种方法之一:
         HEAD
         GET
         POST
    (2)HTTP的头信息不超出以下几种字段:
         Accept
         Accept-Language
         Content-Language
         Last-Event-ID
         Content-Type:
             application/x-www-form-urlencoded、 multipart/form-data、text/plain
    

      浏览器判断跨域为简单请求时候,会在请求头中添加 Origin (协议 + 域名 + 端口)字段 , 它表示我们的请求源,CORS服务端会将该字段作为跨源标志。

    如果想让浏览器接收返回值则需要在响应头中设置

    Access-Control-Allow-Origin:表示服务端允许的请求源,*标识任何外域,多个源 , 分隔
    

      浏览器收到Respnose后会判断自己的源是否存在 Access-Control-Allow-Origin允许源中,如果不存在,会抛出“同源检测异常”。

    非简单请求

    进行非简单请求时候 , 浏览器会首先发出类型为OPTIONS的“预检请求”,请求地址相同 ,
    CORS服务端对“预检请求”处理,并对Response Header添加验证字段,客户端接受到预检请求的返回值进行一次请求预判断,验证通过后,主请求发起。

    # 因method产生的复杂请求,服务端预检时响应头中添加Access-Control-Request-Method
    # 其值是允许的请求方式
    # 因请求头产生的复杂请求,服务端预检时响应头中添加Access-Control-Request-Headers
    # 其值是允许的请求头的键
    
    # 另外还必须传递Access-Control-Allow-Origin
    # 可选项“预检”缓存时间:Access-Control-Max-Age
    

    默认获取到的所有响应头只有基本信息,如果想要获取自定义的响应头,则需要再服务器端设置Access-Control-Expose-Headers。

    obj =  HttpResponse(result)
    obj['Access-Control-Allow-Origin'] = '*'
    obj['Access-Control-Expose-Headers'] = "k1"
    obj["k1"]="v1"
    return obj
    # 发送的响应头就会有k1:v1的键,多个键用,隔开
    

    跨域传输cookie

    在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送

    如果想要发送:

    • 浏览器端:XMLHttpRequest的withCredentials为true
    • 服务器端:Access-Control-Allow-Credentials为true
    • 注意:服务器端响应的 Access-Control-Allow-Origin 不能是通配符 *
      # ajax
      $.ajax({
                      url: "http://c2.com:8000/test/",
                      type: 'PUT',
                      dataType: 'text',
                      headers: {'k1': 'v1'},
                      xhrFields:{withCredentials: true},
                      success: function(data, statusText, xmlHttpRequest){
                          console.log(data);
                      }
                  })
      
      # 视图
      response_obj['Access-Control-Allow-Credentials']= "true"
      

        

  • 相关阅读:
    c/c++指针数组和数组指针
    c/c++指针传参
    c/c++指针理解
    c/c++容器操作
    c/c++ 数组传参
    c/c++ 结构体传参问题
    c++ 创建对象的三种方法
    c/c++ 随机数生成
    c++预处理指令
    团队冲刺第二阶段01
  • 原文地址:https://www.cnblogs.com/wwg945/p/8808929.html
Copyright © 2020-2023  润新知