告别烦恼,彻底解决跨域问题的终极指南-chrome的安全进阶之路

一、跨域问题概述

has been blocked by CORS policy:No 'Access-Control-Allow-Origin'

相信这个跨域的问题大家并不陌生。

二、常规解决方案

来看一下常规的解决方案:

常规的解决跨域问题方案主要包括以下几种:

  1. JSONP:通过动态创建<script>标签,将数据以JSONP形式返回到前端页面。由于<script>标签不受同源策略的限制,因此可以实现跨域访问。
  2. CORS(跨域资源共享):在服务端设置响应头部中的Access-Control-Allow-Origin字段,授权指定的域名进行跨域访问。CORS需要浏览器和服务器双方都支持,且只适用于XMLHttpRequest请求。
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOriginPattern("*");
config.addAllowedHeader("*");
config.addExposedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
  1. 反向代理:将前端请求先发送到同源的后端服务器,然后由后端服务器转发请求到目标服务器,最后再将结果返回给前端页面。这种方式需要部署额外的服务器进行代理,但能够解决通用性较好的跨域问题。

小结:

可以发现前2种方法,大多部分场景下都已经没效果了,当然第3种还是可以的。

三、一些特殊情况

1、调用localhost服务问题

不过还有很多场景没法使用反向代理。比如页面要调用c++的本地服务,在本地就没法代理了。这种场景在以前好像也是可以正常调用的,不过chrome浏览器在2021升级过一次,也就是在 chrome v94 之后 ,chrome浏览器会有这么个提示:

Access to Css stylesheet at ‘http:xx’ from origin ‘ http://xx‘ has been blocked by CORS policy: The request client is not a secure context and the resource is in more-prevate adddress space local

可以看到“local”也就是调用http://localhost (或 http://127.0.0.0)浏览器出于安全考虑会阻止此请求。当然问题出来了也就会有相应的解决方案。

  • 方案一、访问本地数据

访问 http://localhost (或 http://127.*.*.*, http://[::1]) 则只需要把浏览的页面升级为 https 即可

  • 方案二、chrome设置

在试验阶段, 可以设置 chrome 浏览器 chrome://flags/#block-insecure-private-network-requests 值为 disabled, 但这预计会在 chrome v101 失效

当然后续的版本也有这个配置

在新版本我尝试了下,好像都不管用了。

  • 方案三、websocket

其实从图一中可以看出websocket也是存在跨域问题的,但websocket协议没有同源策略的限制。

图二中说明websocket建立连接前会先使用http请求通过后再升级协议成websocket也就是说这里的http会不会也被跨域而阻断了请求,再看第三张图,http get是不受跨域影响的,正好websocket建立连接用的就是http get。

小结:websocket可以解决跨域造成的客户端与服务器无法通信的问题。

四、总结

总结:解决跨域的终级方案

  • 方案一:升级成https通信
  • 方案二:使用websocket通信

五、技术笔记

  • http get没有跨域问题
  • http post有跨域问题,同时限制双方通信
  • websocket有跨域问题,但并不限制双方通信

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3中解决跨域问题,报错Access-Control-Allow-Origin的方法如下: 1. 在项目的config.js文件中添加以下配置: ```javascript proxy: { '/api': { target: 'http://localhost:8081', // 后端服务器的地址 changeOrigin: true, // 是否跨域 ws: true, // 是否代理 websockets secure: true, // 是否https接口 pathRewrite: { '^/api': '' // 路径重置 } } } ``` 这样配置后,所有以`/api`开头的请求都会被代理到后端服务器。 2. 在Vue文件中编写请求: ```javascript created() { axios.get('api/user/findUserAll').then(function (resp) { console.log(resp) }) } ``` 这样就可以使用axios发送跨域请求了,不再报错Access-Control-Allow-Origin。 需要注意的是,axios本质上是JavaScript的ajax封装,因此会受到同源策略的限制。为了解决跨域问题,我们使用代理方式将请求转发到后端服务器。同时,确保后端服务器已经配置了正确的跨域响应头,例如设置Access-Control-Allow-Origin为允许访问的域名。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue3解决跨域问题,报错Access-Control-Allow-Origin](https://blog.csdn.net/weixin_45425813/article/details/123911222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue中axios实现数据交互与跨域问题](https://download.csdn.net/download/weixin_38745361/14902123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栈江湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值