• 简单请求与复杂请求的跨域区别 跨域的cookie携带问题


    一、简单请求与复杂请求 跨域问题

    什么是简单请求

    • 请求方式为GET、HEAD、POST时的请求;
    • 认为设置规范集合之内的首部字段,如Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width;
    • Content-Type 的值仅限于下列三者之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain;
    • 请求中的任意 XMLHttpRequestUpload对象均没有注册任何事件监听器;
    • 请求中没有使用 ReadableStream对象。

    什么是复杂请求

    • 请求方式为PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH;
    • 人为设置了以下集合之外首部字段,即简单请求外的字段;
    • Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain。

    简单请求跨域

    请求头属性

    • Origin Origin和Referer的区别是,Origin包含协议、域名、端口,不包含路径,Referer包含路径

    响应头属性

    • Accept-Control-Allow-Origin: '*' // 或者指定域名
    • Access-Control-Allow-Credentials: 可选,是否允许携带cookie

    请求次数

    • 1次

    复杂请求跨域

    请求头属性

    • Origin:必须
    • Access-Control-Request-Methods: 必须,指定cors可以使用哪些http方法
    • Access-Control-Request-Headers: 可选,指定cors可以额外发送的头信息

    响应头属性

    • Access-Control-Allow-Origin: 必须
    • Access-Control-Allow-Methods: 必须
    • Access-Control-Allow-Headers: 当请求头有Access-Control-Request-Headers时必须,否则可选
    • Access-Control-Allow-Credentials: 可选,是否允许携带cookie
    • Access-Control-Max-Age: 可选

    请求次数

    • 2次,第一次是预检请求OPTIONS。预检请求用于检测是否跨域,如果跨域就不发二次请求了。因为即使不允许跨域,浏览器没有处理响应,请求也是会被服务器处理从而造成影响的

    二、跨域时cookie携带问题

    无论是简单请求还是复杂请求,跨域时携带cookie都需要Access-Control-Allow-Credentials为true才可以携带cookie信息

    除此之外,cookie的携带还被set-cookie所限制,在处理跨域请求cookie携带问题时,这些都是需要综合考虑的

    set-cookie的一些限制

    secure
    对于https, 如果设置了secure=true,那么cookie只能通过https请求发送
    并且现在http请求不允许设置secure属性

    Domain
    可以访问该cookie的域名,默认为origin
    如设置了google.com, 那么向谷歌发请求时就能够携带这个cookie
    Domain默认包含二级域名,常用于和子域名共享用户信息

    Path
    指令了哪些路径可以访问cookie, 模糊匹配

    SameSite

    • null, 即浏览器会在同站、跨站的情况下发送cookie
    • Strict, 浏览器只会在同站时发送cookie
    • Lax, 同站发送cookie, 跨站时只会在导航到本站时发送cookie(如a.href),而img.src, script.src都不会发送cookie
  • 相关阅读:
    内部类与外部类的调用
    Docker学习(十二)中遇到的一些问题汇总
    Docker学习(十一)Docker系列结束-新的开始K8S
    Docker学习(十)Docker容器编排 Docker-compose
    Docker学习(九)Volumn容器间共享数据
    Docker学习(八)容器间单向通信
    Docker学习(七)实战
    Docker学习(六)Dockerfile构建自定义镜像
    Docker学习(五) Dockerfile基础命令
    Docker学习(四)Docker搭建Tomcat
  • 原文地址:https://www.cnblogs.com/ltfxy/p/16407160.html
Copyright © 2020-2023  润新知