当前位置:网站首页>跨域问题解决办法
跨域问题解决办法
2022-08-02 03:34:00 【IICOOM】
什么是跨域?
同源策略(Same-origin policy)
同源策略在web应用安全模型中是一个重要的概念。在这个策略下,浏览器允许第一个网页中包含的脚本可以获取第二个网页的数据,前提是这两个网页在同一个源下。
同源:需要URI、主机名、端口都相同。
这个策略可以防止一个网页上的恶意脚本通过DOM获取其他网页的敏感数据。
需要牢记的一点就是同源策略只应用于脚本,这意味着像images、css和其他动态加载的脚本 可以通过对应的标签跨域访问资源。
CORS
跨域资源共享 Cross-origin resource sharing (CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。
CORS存在的意义
出于安全性,浏览器限制脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest 和 Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文包含了正确 CORS 响应头。
跨源域资源共享(CORS)机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。
了解了上面的内容,我们解决浏览器控制台的跨域问题,一般有两个方向:
- 后端服务设置允许跨域访问
- 前端通过代理访问资源
服务端
用 Node.js 的一个框架 koa 来举例,解决跨域使用 koa-cors 非常简单,如下:
var koa = require('koa');
var route = require('koa-route');
var cors = require('koa-cors');
var app = koa();
app.use(cors());
app.use(route.get('/', function() {
this.body = {
msg: 'Hello World!' };
}));
app.listen(3000);
这个中间件大概做了这样的事情:
module.exports = () => {
return async function(ctx, next) {
ctx.set('Content-Type', 'application/json');
ctx.set('Access-Control-Allow-Origin', '*');
ctx.set('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, PUT');
ctx.set('Access-Control-Allow-Headers', 'X-Requested-With, content-type, X-Authorization, X-uuid');
ctx.json = json.bind(ctx);
ctx.halt = halt.bind(ctx);
try {
await next();
} catch (e) {
return ctx.halt(e.code, e.message);
}
};
};
这样前端收到的响应会是下面的样子:
HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml
本例中,服务端返回的 Access-Control-Allow-Origin: * 表明,该资源可以被 任意 外域访问。
前端代理
如果使用了webpack 那么配置一个代理就很容易,通过代理模拟出和服务端同源的请求。
//webpack.config.js
module.exports = {
//...
devServer: {
proxy: {
'/api': {
target: 'http://localhost:3000',
pathRewrite: {
'^/api': '' },
},
},
},
};
这样前端发起的请求包含/api的路径就会被代理到 http://localhost:3000,并且会把/api替换为空。如果你的接口地址本来就包括/api,那只要把pathRewrite: { ‘^/api’: ‘’ }去掉即可。
更多高级功能可参考 官网
边栏推荐
猜你喜欢
Compatible with C51 and STM32 Keil5 installation method
云服务器web项目部署详解
GM8775C MIPI转LVDS调试资料分享
全加器高进位和低进位的理解
MPU6050 accelerometer and gyroscope sensor is connected with the Arduino
TeamCode 产品 UI 全新升级,快来体验吧
MQ-5 combustible gas sensor interface with Arduino
开源代码交叉编译操作流程及遇到的问题解决(lightdm)
剑指Offer 36.二叉搜索树与双向链表 中序遍历
The use and simulation of vector implementation:
随机推荐
汇编语言跳转指令总结
【plang 1.4.4】编写茶几玛丽脚本
Comparison between Boda Industrial Cloud and Alibaba Cloud
Anaconda(Jupyter)里发现不能识别自己的GPU该怎么办?
振芯科技GM8285C:功能TTL转LVDS芯片简介
调试九法准则
unity学习(一):自动化创建模板脚本
发布全新的配置格式 - AT
学习(四):显示FPS,和自定义显示调试
2019 - ICCV - 图像修复 Image Inpainting 论文导读《StructureFlow: Image Inpainting via Structure-aware ~~》
Lightly 支持 Markdown 文件在线编写(文中提供详细 Markdown 语法)
unity学习(五):Excel表格读取和数据类生成
基础IO(上):文件管理和描述符
proteus数字电路仿真——入门实例
引擎开发日志:场景编辑器开发难点
unity相关的功能链接
只出现一次的字符
GM7150,振芯科技,视频解码器,CVBS转BT656/601,QFN32,替换TVP5150/CJC5150
78XX 79XX多路输出电源
剑指Offer 34.二叉树中和为某一值的路径 dfs+回溯