• 详谈跨域问题


    项目场景:

    项目场景:你本地vue的项目需要和后台进行联调测试


    问题描述

    因为你修改的频率比较高,可能需要你多次打包并且部署在nginx服务器上。但是你实际上并不想这么做,你想刚修改完成就能看到效果,并且能够正确请求到服务器接口。

    原因分析:

    这种情况下极有可能出现跨域的问题。

    出现这种问题呢,究其根本原因是因为浏览器的同源限制策略,不关服务器的事情。服务器在任何时候都是默认情况支持任何来源的请求的。除非你自己去配置一些参数,或者禁止一些域的访问。

    现代浏览器要求不同源的请求禁止访问其资源。

    不管同不同源,实际上请求已经到达了服务器,这个你本身可以通过断点或者日志查看到,一个可以看你服务的接口的日志输出,一个可以看tomcat的access日志输出,可以看到接口到达,并且浏览器请求的接口返回状态是200。

    那为什么返回的时候F12看不见呢,就是浏览器请求接口(预检)的响应头中没有某个参数值,具体参数w3c的cros策略,所以浏览器不给你解析,并且抛出不同源,跨域的问题,可在console看到。

    你一个get请求,直接在浏览器输入请求地址,却能正常返回,这种不存在跨域的概念,没有来源这个属性。而在npm run serve 运行的vue项目中写了这个请求,并且在浏览其中打开vue写的页面,会出现跨域的错误。

    postman 也是如此,根本不关心你安全不安全,没有预检请求这么个概念,只管获取资源即可。

    解决方案:

    上面我们分析到是浏览器的问题

    1、从浏览器的角度解决
    那就不要发这个预检请求,或者我本身就不考虑安全问题,不需要你的同源限制策略,那么关闭就行了。

    这里说的是Chrome配置,其他浏览器请自行搜索。先不要动你原来Chrome配置,创建一个新的快捷方式,
    右键属性,添加 启动参数  --disable-web-security --user-data-dir=C:\user
    我自己的添加完成是这样的
    "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir=C:\user
    
    • 1
    • 2
    • 3
    • 4

    后面这个目录 任意位置任意文件即可,就是存放你的个人隐私的,比如历史记录什么的。
    在这里插入图片描述
    在这里插入图片描述看到这个就OK了

    2、从服务器的角度
    (1)tomcat 配置 修改 web.xml
    只要是添加corsfilter过滤器,给增加一个参数配置,就是把响应体里面的响应头参数加上,告诉浏览器访问是被允许的。我记得不需要什么jar,可自行查阅

     
            CORS
            com.thetransactioncompany.cors.CORSFilter
            
                cors.allowOrigin
                *
            
            
                cors.supportedMethods
                GET,POST,Options 
            
            
                cors.supportsCredentials
                true
            
        
        
            CORS
            /*
         
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    (2)服务配置跨域
    就是平时我们代码去配置的,这个就比较多了,只要给响应体加上

    response.setHeader("Access-Control-Allow-Origin", "*");
    
    response.setHeader("Access-Control-Allow-Credentials", "true");
    
    String headers = "Origin, Accept-Language, Accept-Encoding,X-Forwarded-For, Connection, Accept, User-Agent, Host, Referer,Cookie, Content-Type, Cache-Control";
    
    response.setHeader("Access-Control-Allow-Headers", headers);
    
    response.setHeader("Access-Control-Request-Method", "GET,POST");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这些参数我记得没这么多,其他参数来了解一下,加那儿都行,过滤器也行,直接写在接口也行,主要看规范和你的代码风格。

    response.setHeader("Access-Control-Allow-Origin", "*");
    
    • 1

    最简单的就是springboot项目直接加 @CrossOrgin

    一般情况下生产环境的都是同源,但是偶尔有不同源的。并且大公司中的顶级域名都是一样的,只是到最后解析成不同的ip+port了。

    (3)vue配置代理
    假装是同源的。
    这个尝试了很久,没解决不知道问题出在什么地方。

    在这里插入图片描述

  • 相关阅读:
    空间曲面的法向量,法线,切平面
    Vue3 快速入门及巩固基础
    Python中的元素相乘与矩阵相乘(附Demo)
    理解 Delphi 的类(一) - 从结构/记录谈起
    android studio运行APP到手机
    科研TCO-PEG-Alkyne|TCO-PEG-ALK|反式环辛烯-聚乙二醇-炔基
    栈溢出至getshell分析及利用
    3. 一级缓存解析
    【SSD1306 OLED屏幕测试程序 (开源)orangepi zero2 全志H616 】.md updata: 23/11/07
    线程的创建方式
  • 原文地址:https://blog.csdn.net/H2677lucy/article/details/126902688