详谈跨域问题

项目场景:

项目场景:你本地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

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

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

 <filter>
        <filter-name>CORS</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
        <init-param>
            <param-name>cors.allowOrigin</param-name>
            <param-value>*</param-value>
        </init-param>
        <init-param>
            <param-name>cors.supportedMethods</param-name>
            <param-value>GET,POST,Options</param-value> 
        </init-param>
        <init-param>
            <param-name>cors.supportsCredentials</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

(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");

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

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

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

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

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值