当前位置: 首页 > news >正文

什么是跨域以及怎么处理跨域问题

文章目录

    • 什么是跨域?
    • 跨域问题常见场景
    • 怎么处理跨域
      • 1、配置代理
      • 2、CORS(跨域资源共享)
      • 3、JSONP(仅限 GET 请求)
      • 4、使用 WebSocket
    • 注意事项:

什么是跨域?

跨域(Cross-Origin)指的是在浏览器的同源策略下,不同源(Origin)之间进行资源请求时出现的安全限制。同源策略要求网页中的资源请求(比如 AJAX 请求、图片、脚本等)必须来自相同的协议、域名和端口,否则浏览器会阻止跨域的请求。同源策略的目的是为了保护用户的隐私和安全。
在 Vue 3 项目中处理跨域通常需要配置代理和使用 CORS(跨域资源共享)等技术。通过配置开发服务器代理,将前端的请求代理到后端,从而避免跨域问题。

跨域问题常见场景

  • 不同域名之间的请求: 比如前端代码部署在 http://example.com,而请求后端接口在 http://api.example.com。
  • 不同子域之间的请求: 比如前端代码部署在 http://www.example.com,而请求后端接口在 http://api.example.com。
  • 不同协议之间的请求: 比如前端代码部署在 https://example.com,而请求后端接口在 http://api.example.com。
  • 不同端口之间的请求: 比如前端代码部署在 http://example.com,而请求后端接口在 http://example.com:8080。

怎么处理跨域

1、配置代理

在 Vue 3 项目中处理跨域经常通过配置开发服务器代理,将前端的请求代理到后端,从而避免跨域问题。
创建 vue.config.js 文件(如果项目中没有),并添加以下内容:

// vue.config.js
module.exports = {devServer: {proxy: {'/api': {target: 'http://api.example.com', // 后端服务地址changeOrigin: true, // 开启跨域pathRewrite: {'^/api': '', // 将请求路径中的 '/api' 移除},},},},
};

上述示例中,我们配置了一个代理,将以 /api 开头的请求代理到 http://api.example.com 主机。这样,当你在前端代码中发起请求时,只需使用 /api 开头的路径,而不用担心跨域问题。

2、CORS(跨域资源共享)

确保后端服务正确配置了 CORS。在后端的响应中添加跨域响应头:

// Express.js 例子
const express = require('express');
const app = express();// 允许所有来源访问
app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');res.header('Access-Control-Allow-Headers', 'Content-Type');next();
});
// 其他路由和中间件处理

3、JSONP(仅限 GET 请求)

对于只支持 GET 请求的情况,你可以考虑使用 JSONP。Vue 3 本身不直接支持 JSONP,但可以使用第三方库或手动实现 JSONP 请求。

// 使用 JSONP 请求
const script = document.createElement('script');
script.src = 'http://api.example.com/data?callback=handleData';// 在全局定义回调函数
window.handleData = function(data) {// 处理返回的数据
};
// 将脚本添加到文档中
document.body.appendChild(script);

请注意,JSONP 有一些安全性和限制,应慎重使用。

4、使用 WebSocket

  • 在某些情况下,可以考虑使用 WebSocket 进行通信。WebSocket 不受同源策略限制。

注意事项:

  • 在生产环境中,代理配置仅在开发服务器中有效,因为在生产环境中,前端代码通常会被打包并与后端服务一起部署。
  • 根据实际后端服务配置修改 target 的值和其他代理配置项。
http://www.lryc.cn/news/276240.html

相关文章:

  • 【Linux Shell】11. 输入/输出 重定向
  • 数据库-简单表的操作And查看表的结构
  • <设计模式修炼>模板方法模式的使用场景和注意事项学习
  • android 分享文件
  • UE5 C++(十一)— 碰撞检测
  • 时序数据库InfluxDB、TimeScaleDB简介
  • 复试 || 就业day05(2024.01.08)项目一
  • 基于商品列表的拖拽排序后端实现
  • 小游戏实战丨基于PyGame的贪吃蛇小游戏
  • AOP(面向切面编程)基于XML方式配置
  • 多线程的概念
  • DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选
  • Java实现责任链模式
  • rabbitmq延时队列相关配置
  • 【工具】推荐一个好用的代码画图工具
  • Leetcode14-判断句子是否为全字母句(1832)
  • HTTP和TCP代理原理及实现,主要是理解
  • MySQL中的连接池
  • css计时器 animation实现计时器延时器
  • 【win11 绕过TPM CPU硬件限制安装】
  • k8s的yaml文件中的kind类型都有哪些?(清单版本)
  • Jetpack Room使用
  • HarmonyOS应用开发之ArkTS语言学习记录
  • windows 下 mongodb6.0 导入导出json文件
  • 如何给 unplugin-vue-components/vite 写一个简单的 resolver
  • MYSQL篇--索引高频面试题
  • 视频号小店怎么上架商品?实操分享,干货满满!
  • Python 常用数据类型
  • 基于yolov2深度学习网络的车辆行人检测算法matlab仿真
  • 【QT】中英文切换