码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Chrome 跨域问题CORS 分析


    先叠个甲,有错误,望沟通指正!

    文章目录

    • 1.什么是跨域报错
    • 2.为什么postman可以,浏览器访问就不行?根本原因是什么?
      • 2.1浏览器是依据什么来报错跨域的?
    • 3.常规解决方案的分析
      • 方案1.通过代理解决
      • 方案2.被请求的B域的服务端开启Access-Control-Allow-Origin返回头的支持
      • 方案3.通过设置浏览器关闭同源策略来实现访问互通
    • 4.对比3种方案

    1.什么是跨域报错

    has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

    类似上面的报错 ,就是出现了跨域限制访问问题

    2.为什么postman可以,浏览器访问就不行?根本原因是什么?

    同源策略(Same-Origin Policy),这个是浏览器的一个策略.也就是在A的域 去请求B域的资源,是不被浏览器允许的
    这一种存在于浏览器上的安全策略,所以你用edge还是chrome,都会出现这个问题.而使用postman则没有.
    抛出这个报错的根源在于浏览器

    2.1浏览器是依据什么来报错跨域的?

    并不是只通过IP来判断是否跨域报错的.
    这里还涉及到一个参数就是Access-Control-Allow-Origin.如果请求B域的时候,返回的header带有这个参数.那么也是被浏览器允许的(可以通过同源策略的安全限制)

    B域的服务,返回头中是否带有Access-Control-Allow-Origin,取决于B域的后台服务的代码中,是否开启了相关功能.
    具体JAVA GOLANG PYTHON C#,如何开启Access-Control-Allow-Origin ,可以全网搜一下 ,不赘述了

    也就是B域的服务端,开启了Access-Control-Allow-Origin,那么所有浏览器都可以跨域访问呢这个资源

    3.常规解决方案的分析

    方案1.通过代理解决

    也就是最常见到的,在使用vue-admin-templete等前端分离项目开发时,咱们在vue.config.js里面配置的proxy
    类似这样

    devServer: {
        port: port,   //服务器 是A域
        open: true,
        overlay: {
          warnings: false,
          errors: true
        },
        before: require('./mock/mock-server.js'),
        proxy: {
          '/dev-api/vat':{
            target:"http://B域:8080",
            changeOrigin: true,
          }
        }
      },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    结论: 核心原理也就是转发. ,对于浏览器来说,访问/dev-api/vat的时候,实际上确实是访问服务器的/dev-api/vat资源.
    但是服务器在后台启动了一个代理,将/dev-api/vat资源转发给了B域.
    因为是代理服务发起给B域的,所以没有同源策略的限制.代理服务自然能够成功收到B域的返回.
    接下来代理服务将结果返回给浏览器(这里对于浏览器来说,代理服务和A域 是同源的 所以没有报错)

    方案2.被请求的B域的服务端开启Access-Control-Allow-Origin返回头的支持

    具体JAVA GOLANG PYTHON C#,如何开启Access-Control-Allow-Origin ,可以全网搜一下 ,不赘述了
    也就是B域的服务端,开启了Access-Control-Allow-Origin,那么多有浏览器都可以跨域访问呢这个资源

    方案3.通过设置浏览器关闭同源策略来实现访问互通

    以chrome为例 ,在快捷方式–属性–目标这里,追加参数 --disable-web-security --user-data-dir=用户数据目录 即可

    例如
    "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir=C:\temp

    此时 打开chrome将不再受跨域的束缚,但是会提示你安全性降低

    4.对比3种方案

    方案1-代理方案2-服务端代码放开方案3-浏览器关闭同源策略
    安全性相对 高相对 中相对 低
    方便性相对 中相对 中相对 高
    使用场景开发调试
    多个服务继承部署
    开发调试
    多个服务继承部署
    生产多环境调用
    无所不能
    调用区别前端所在的服务器去调用B域可以在浏览器访问端直接调用B域随便搞
  • 相关阅读:
    全局锁、表锁、行锁
    vb判断是否联网,判断网络状态调用gethostbyname API函数
    【实验分享】CCIE—BGP反射器实验
    websocket请求通过IteratorAggregate实现流式输出
    CodeSite for .NET实时本地和远程应用程序日志记录
    Allavsoft Video Downloader Converter Mac(视频下载工具)
    Python代码大全,海量代码任你下载
    【计算机网络】301 永久重定向的缓存问题
    KT148A语音芯片使用串口uart本控制的完整说明_包含硬件和指令举例
    Git extension 中合并工具kdiff3乱码问题
  • 原文地址:https://blog.csdn.net/gxlzhhx/article/details/136716837
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号