前端跨域问题详解:原因、解决方案与最佳实践
引言
在现代Web开发中,跨域问题是前端工程师几乎每天都会遇到的挑战。随着前后端分离架构的普及和微服务的发展,跨域请求变得愈发常见。本文将深入探讨跨域问题的本质、各种解决方案以及在实际开发中的最佳实践。
一、什么是跨域问题?
1.1 同源策略(Same-Origin Policy)
跨域问题的根源在于浏览器的同源策略,这是浏览器的一种安全机制,用于限制一个源的文档或脚本如何与另一个源的资源进行交互。
同源的定义:两个URL的协议(protocol)、域名(host)和端口(port)完全相同,则视为同源。
例如:
https://example.com/page1
和https://example.com/page2
→ 同源https://example.com
和http://example.com
→ 不同源(协议不同)https://example.com
和https://api.example.com
→ 不同源(域名不同)https://example.com
和https://example.com:8080
→ 不同源(端口不同)
1.2 跨域限制的范围
同源策略主要限制以下几种行为:
- AJAX请求(XMLHttpRequest和Fetch API)
- Web字体(CSS中通过@font-face使用跨域字体资源)
- WebGL纹理
- 使用drawImage将图片或视频绘制到canvas
- Cookie、LocalStorage和IndexDB的读取
二、常见的跨域解决方案
2.1 CORS(跨源资源共享)
CORS(Cross-Origin Resource Sharing) 是目前最主流的跨域解决方案,它允许服务器声明哪些源可以访问其资源。
2.1.1 简单请求与非简单请求
简单请求需满足以下条件:
-
方法为GET、HEAD或POST
-
仅包含以下头信息:
- Accept
- Accept-Language
- Content-Language
- Content-Type(仅限于application/x-www-form-urlencoded、multipart/form-data、text/plain)
不满足上述条件的即为非简单请求。
2.1.2 CORS实现方式
服务器端设置响应头:
Access-Control-Allow-Origin: https://example.com // 或 * 表示允许任何源
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true // 允许携带凭证
Access-Control-Max-Age: 86400 // 预检请求缓存时间
Node.js Express示例:
const express = require('express');
const app = express();app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', 'https://example.com');res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');res.header('Access-Control-Allow-Credentials', 'true');next();
});
2.2 JSONP(JSON with Padding)
JSONP是一种利用<script>
标签没有跨域限制的特性实现的解决方案。
实现原理:
- 前端定义一个回调函数
- 动态创建
<script>
标签,src指向API地址并传入回调函数名 - 服务器返回一段调用该回调函数的JavaScript代码
前端实现:
function jsonp(url, callbackName, success) {const script = document.createElement('script');script.src = `${url}?callback=${callbackName}`;window[callbackName] = function(data) {success(data);document.body.removeChild(script);delete window[callbackName];};document.body.appendChild(script);
}// 使用示例
jsonp('http://api.example.com/data', 'handleData', function(data) {console.log('Received data:', data);
});
服务器端实现(Node.js):
app.get('/data', (req, res) => {const callbackName = req.query.callback;const data = { foo: 'bar' };res.send(`${callbackName}(${JSON.stringify(data)})`);
});
局限性:
- 仅支持GET请求
- 安全性较差(容易受到XSS攻击)
- 难以处理错误
2.3 代理服务器
通过同源的代理服务器转发请求,绕过浏览器的同源限制。
2.3.1 开发环境代理
Webpack devServer配置:
module.exports = {devServer: {proxy: {'/api': {target: 'http://api.example.com',changeOrigin: true,pathRewrite: { '^/api': '' }}}}
};
2.3.2 Nginx反向代理配置
server {listen 80;server_name local.example.com;location /api/ {proxy_pass http://api.example.com/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
2.4 WebSocket
WebSocket协议不受同源策略限制,可以实现跨域通信。
前端实现:
const socket = new WebSocket('ws://api.example.com/socket');socket.onopen = function() {console.log('Connection established');socket.send('Hello server!');
};socket.onmessage = function(event) {console.log('Message from server:', event.data);
};
2.5 postMessage
window.postMessage
可以实现不同窗口/iframe之间的跨域通信。
主窗口代码:
const iframe = document.getElementById('my-iframe');
iframe.contentWindow.postMessage('Hello from main window', 'https://child.example.com');
iframe代码:
window.addEventListener('message', function(event) {if (event.origin !== 'https://parent.example.com') return;console.log('Received message:', event.data);event.source.postMessage('Hello back!', event.origin);
});
2.6 document.domain
对于具有相同二级域名的情况(如a.example.com和b.example.com),可以通过设置document.domain
实现跨域。
实现方式:
// 在两个页面中都设置
document.domain = 'example.com';
限制:
- 仅适用于具有相同基础域名的页面
- 需要双方都设置document.domain
- 现代浏览器中逐渐被限制
三、跨域中的特殊问题与处理
3.1 携带凭证的请求
当请求需要携带Cookie或HTTP认证信息时,需要特殊处理:
前端(Fetch API):
fetch('https://api.example.com/data', {credentials: 'include'
});
服务器端:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://example.com // 不能是 *
3.2 预检请求(Preflight Request)
对于非简单请求,浏览器会先发送一个OPTIONS方法的预检请求。
预检请求示例:
OPTIONS /resource HTTP/1.1
Host: api.example.com
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type, X-Custom-Header
服务器响应:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, X-Custom-Header
Access-Control-Max-Age: 86400
3.3 跨域资源共享的安全考虑
- 不要使用Access-Control-Allow-Origin: *当需要携带凭证时
- 严格限制允许的方法和头信息
- 考虑使用CSRF令牌防止跨站请求伪造
- 限制Access-Control-Max-Age的时间
四、实际开发中的最佳实践
4.1 开发环境
- 使用Webpack/Vite等构建工具的代理功能
- 配置环境变量管理不同环境的API地址
- 使用Chrome插件临时禁用跨域限制(仅用于开发)
4.2 生产环境
- 正确配置CORS头信息
- 对于公共API,考虑使用API网关处理跨域问题
- 对于敏感操作,实施CSRF防护机制
- 考虑使用OAuth等认证机制替代Cookie
4.3 移动端/混合应用
- 使用Cordova/Ionic等框架时,可能需要配置白名单
- React Native中可以使用原生模块处理网络请求
- 小程序开发中需要在后台配置合法域名
五、未来趋势
- COEP/COOP:新的安全策略(Cross-Origin Embedder Policy/Cross-Origin Opener Policy)
- SameSite Cookie属性:更严格的Cookie跨站限制
- Private Network Access:限制公网网站访问私有网络资源
- Fetch Metadata:提供更多请求上下文信息供服务器决策
结语
跨域问题是前端开发中的常见挑战,理解其背后的原理和各种解决方案对于现代Web开发者至关重要。在实际项目中,应根据具体需求和安全考虑选择合适的跨域方案。随着Web安全标准的不断演进,跨域处理的最佳实践也将持续更新,开发者需要保持学习和适应。
希望本文能帮助你全面理解跨域问题,并在实际开发中做出明智的技术决策。
相关文章:
前端跨域问题详解:原因、解决方案与最佳实践
引言 在现代Web开发中,跨域问题是前端工程师几乎每天都会遇到的挑战。随着前后端分离架构的普及和微服务的发展,跨域请求变得愈发常见。本文将深入探讨跨域问题的本质、各种解决方案以及在实际开发中的最佳实践。 一、什么是跨域问题? 1.1…...
第五届图像、视觉与智能系统国际会议(ICIVIS 2025)参会通知
大会官网: http://www.icivis.net/ 官方邮箱:icivis163.com 会议地点:杭州师范大学仓前校区(余杭塘路2318号) 会议时间:2025年5月23日-5月25日 主办单位:杭州师范大学 1.一般会员注册 提交注册表以后…...
PCB设计工艺规范(二)基本布局要求
基本布局要求 1.PCBA加工工序2.对器件以及PCB布局要求 资料来自网络,仅供学习使用。 1.PCBA加工工序 制成板的元件布局应保证制成板的加工工序合理,以便于提高制成板加工效率和直通率。 PCB 布局选用的加工流程应使加工效率最高。 常用 PCBA 的6种主流…...
SWIG 和 JNA / JNI 等 C 接口封装工具及进行 C 接口的封装
SWIG 相关 SWIG 是什么 SWIG 是一个软件开发工具,是一个 封装 C/C++ 动态库供其他编程语言调用的神器。 使用它可以简化不同语言与与 C/C++ 语言的交互。简单点说,SWIG 是一个编译器,它以 C/C++的声明为输入,创建从其他语言包括常见的脚本语言如 Javascript、Perl、PHP、…...
【Bootstrap V4系列】学习入门教程之 布局
Bootstrap V4 学习入门教程之 布局 一、容器1.1 All-in-one 一体化1.2 Fluid 流体1.3 Responsive 快速响应 二、栅格系统2.1 网格选项2.2 自动布局列等宽等宽多线 2.3、设置一列宽度2.4、可变宽度内容 一、容器 容器是Bootstrap中最基本的布局元素,在使用我们的默认…...
Nginx功能全解析:你的高性能Web服务器解决方案
Nginx是一款开源的高性能HTTP和反向代理服务器,同时也是IMAP/POP3/SMTP代理服务器。自2004年推出以来,Nginx因其卓越的性能、稳定性和丰富的功能而广泛应用于各种规模的网站。本文将深入解析Nginx的主要功能,帮助你充分利用这款强大的Web服务…...
OpenAI 2025 4月最新动态综述
2025年4月,OpenAI在人工智能领域持续引领创新浪潮,发布了多项重磅新产品和技术,推动AI进入更加实用和智能的新阶段。以下是近期OpenAI的重点动态整理: 1. GPT-5预览版发布,迈入通用AI工业化时代 2025年4月15日&#…...
综合案例建模(1)
文章目录 滚花手扭螺丝机箱封盖螺丝螺丝孔锥形垫片 滚花手扭螺丝 前视基准面画草图,旋转生成主体 倒角0.5 顶面,草图转换实体引用,去复制边线 生成螺旋线路径 顶面绘制草图 上一步画的草图沿螺旋线扫描切除 镜像扫描特征 阵列镜像扫描特征 创…...
ComfyUI 学习笔记,案例3:img2img
背景 ComfyUI 学习笔记,第三个案例 img2img,官网文档的 安装篇 部分找到桌面版,于是就下载了桌面版本,运行第三个案例。 注意要点: 桌面版安装时检测到本机设备不符合时,需要手动选择安装配置࿰…...
水利水电安全员A证考试核心知识点
水利水电安全员A证考试核心知识点 水利水电安全员A证考试主要考查安全生产管理、法律法规、专业技术及应急处理能力,以下是核心知识点: 1. 安全生产法律法规 《安全生产法》:明确企业主体责任、从业人员权利与义务、事故追责等。 《水利工…...
Verilog仿真模块--真随机数生成器
前言 在进行功能仿真时,总是希望仿真条件能覆盖尽量多的情况,因此,经常需要产生随机数作为仿真的输入。Verilog 和 SV 中有能够产生随机数的系统函数 $random,可惜的是此函数产生的随机数是伪随机数,重新再跑一次仿真&…...
融合AI助力医疗提效,华奥系医务系统助力医院数字化升级!
医疗资源供需优化一直是医院关注的重点问题。据此,华奥系科技推出华奥系智能医务管理系统,并基于DeepSeek-R1大模型,自主研发将AI智能诊疗助手融入系统。以“智能驱动效率、数据赋能管理”为核心,打造覆盖医院全场景的数字化解决方…...
UDP报文结构
文章目录 简介UDP报文结构解析UDP的特点使用 UDP 的注意事项 简介 用户数据报协议(User Datagram Protocol,UDP)是传输层的一种无连接协议,它与TCP相比,没有复杂的连接建立、维护和拆解过程,在传输效率上具…...
综合开发-手机APP远程控制PLC1500柱灯的亮灭
要通过 Unity3D 开发的手机 App 控制 电气柜上面的柱灯,需要WIFI模块作为桥梁,按照以下步骤实现: 1. 硬件准备(硬件部分) 所需材料 ESP32开发板(如ESP32-WROOM-32&a…...
4:机器人目标识别无序抓取程序二次开发
判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…...
数据结构篇:线性表的另一表达—链表之单链表(下篇)
目录 1.前言 2.是否使用二级指针 3.插入/删除 3.1 pos位置前/后插入 3.2 查找函数 3.3 pos位置删除 3.4 pos位置后面删除 3.5 函数的销毁 4.断言问题 4.1 断言pphead 4.2 断言*pphead 5.三个文件的代码 5.1 头文件 5.2 具体函数实现 5.3 测试用例 1.前言 之前是讲…...
C# 异步详解
C# 异步编程详解 一、异步编程基础概念 1. 同步 vs 异步 同步(Synchronous):任务按顺序执行,前一个任务完成后才会执行下一个异步(Asynchronous):任务可以非阻塞地启动,主线程可以继续执行其他操作 2. 异步编…...
X²+1素数问题
X1素数问题是与哥德巴赫猜想和孪生素数猜想同时代的著名数学难题。是否有无穷个正整数x,使得x1总是素数? 其困难程度不亚于哥德巴赫猜想。特别是100多年以来,许许多多一流数论学者对这个问题进行了研究。 X1素数 X1素数是一个著名的猜想&…...
【自定义控件实现最大高度和最大宽度实现】
背景 开发中偶尔遇到控件宽度或者高度在自适应的情况下,有个边界值,也就是最大值。 比如高度自适应的情况下最大高度300dp这种场景。 实现 关键节点代码: Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)…...
基于C++的IOT网关和平台4:github项目ctGateway交互协议
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...
DeepSeek谈《凤凰项目 一个IT运维的传奇故事》
《凤凰项目:一个IT运维的传奇故事》(The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win)是Gene Kim、Kevin Behr和George Spafford合著的一部小说,通过虚构的故事生动展现了IT运维中的核心挑战和Dev…...
Spyglass:官方Hands-on Training(一)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译(有删改),Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…...
10.idea中创建springboot项目_jdk17
10.idea中创建springboot项目_jdk17 1. 准备工作 安装 JDK 17: 确保已安装 JDK 17,并配置环境变量 JAVA_HOME 指向 JDK 17 的安装路径。在 IntelliJ IDEA 中验证 JDK 配置:File → Project Structure → SDKs。 安装 IntelliJ IDEA&#x…...
指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
1. GCC 自动循环展开是怎么展开的? 当你使用 -O3 这样的优化选项时,GCC 会分析你的循环。如果它认为展开循环有利可图,它会做类似这样的事情(概念上的): 原始循环 (Conceptual C Code): for (int i 0; i …...
hadoop伪分布式模式
以下是 Hadoop 伪分布式模式(Pseudo-Distributed Mode)的环境搭建步骤。伪分布式模式下,Hadoop 的各个组件(如 HDFS、YARN、MapReduce)以独立进程运行,但所有服务均部署在单台机器上,模拟多节点…...
C++入门小馆: 模板
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
# 基于 Python 和 jieba 的中文文本自动摘要工具
基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代,快速准确地提取文本核心内容变得至关重要。今天,我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具,帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…...
.NET平台用C#在PDF中创建可交互的表单域(Form Field)
在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持…...
Azure AI Foundry实战:从零开始构建智能应用
1. 引言 在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业关注的焦点。微软的Azure AI Foundry应运而生,为AI应用开发提供了一站式解决方案。本文将带您深入了解Azure AI Foundry,并通过实战指南,帮助您从零开始构建智能应用。 2. Azure AI Found…...
YOLO视觉模型可视化训练与推理测试工具
推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…...
数据清洗的定义跟实际操作
数据清洗的定义 数据清洗(Data Cleaning) 是指对原始数据进行处理,以纠正、删除或填补不完整、不准确、重复或无关的数据,使其符合分析或建模的要求。数据清洗是数据预处理的关键步骤,直接影响后续分析和机器学习模型…...
如何用AI生成个人职业照/西装照?
一、核心工具推荐与对比 1. 搜狐简单AI • 特点: • 一键生成:上传1张生活照,AI自动生成职业照/西装照,支持商务精英、韩系女主等20模板。 • 自然微调:优化五官比例、柔化法令纹,保留个人特色࿰…...
Ecology中拦截jquery.ajax请求接口后的数据
功能:获取调用接口之后的数据在进行返回参数重写 首先ecology中一般直接看不到源码的,为什么知道是jquery.ajax请求呢,需要用到开发者工具 点开这里之后就能知道调用接口具体走的是什么逻辑然后返回值又做了哪些操作 一般来说,文…...
基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)
A 1 km daily soil moisture dataset over China based on in-situ measurement (2000-2022) 关键数据集分类地表参数数据集时间分辨率日空间分辨率1km - 10km共享方式开放获取数据大小592.76 GB数据时间范围 1999-12-31 — 2022-12-31 元数据更新时间2024-08-09 数据集摘要 …...
Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度
学习目标: 通过自定义的CronScheduler调度器在兼容标准的调度器的情况下,查询自定义任务表去生成调度任务并分配给celery worker进行执行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章:Celery框架组件分析及使用 学习内容ÿ…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
一、选择题 第 1 题 单选题 题目:在 C++ 中下列哪个不属于字符型常量 ( )。 A. ‘a’ B. ‘\x2A’ C. ‘@’ D. “F” 答案:D 解析:字符型常量使用单引号括起单个字符(如 A、C),或转义字符(如 B 中的十六进制转义字符)。D 选项 “F” 使用双引号,属于字符串常量,而…...
windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)
服务器数据库的搭建和远程访问 mysql数据库安装(详细) window安装mysql详细流程 路程:重设MySQL5密码,发现远程服务器原本有一个MySQL5,尝试在服务器本地建立连接被拒绝,因为不知道密码。 (1…...
w~大模型~合集14
我自己的原文哦~ https://blog.51cto.com/whaosoft/13884560 #Attention as an RNN Bengio等人新作:注意力可被视为RNN,新模型媲美Transformer,但超级省内 , 既能像 Transformer 一样并行训练,推理时内存需求又不随 token 数…...
2025平航杯—团队赛
2025平航杯团队赛 计算机取证 分析起早王的计算机检材,起早王的计算机插入过USB序列号是什么(格式:1)分析起早王的计算机检材,起早王的便签里有几条待干(格式:1)分析起早王的计算机检材,起早王的计算机默认浏览器是什…...
5、SpringBoot整合RabbitMQ
5.1 工作队列模式 1、生产者 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…...
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning Describe Anything: Detailed Localized Image and Video Captioning PDF: https://arxiv.org/pdf/2504.16072 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: htt…...
Seata客户端@GlobalTransactional核心源码解析
文章目录 前言一、GlobalTransactional1.1、wrapIfNecessary1.2、handleGlobalTransaction1.3、invoke 二、总结 前言 Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中,开启事务,执行事务,回滚/提交事务,统一由Spring…...
某大麦某眼手机端-抢票
引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。作为一名技术爱好者,你是否想过用技术手段提高抢票成功率?本文将为你揭秘大麦手机端抢票的核心技术…...
深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具 前言 在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模…...
AI 知识库:企业知识管理的利器
在数字化转型的今天,企业每天都会产生海量的信息和数据。从客户资料到内部文档,从市场调研到项目经验,这些宝贵的知识资源构成了企业的核心竞争力。然而,你是否注意到这样一个问题:很多企业在快速发展的同时࿰…...
【STM32实物】基于STM32的RFID多卡识别语音播报系统设计
演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…...
[实战] Petalinux驱动开发以及代码框架解读
目录 Petalinux驱动开发以及代码框架解读一、引言二、步骤2.1 创建PetaLinux工程2.2 配置硬件描述文件2.3 设备树配置2.4 建立驱动框架2.5 编辑 .bb 文件2.6 编写驱动文件2.7 编写 Makefile2.8 验证配方配置2.9 集成驱动到 RootFS2.10 全系统编译与部署2.11 启动验证 三、框架解…...
ArcGIS Pro几个小知识点分享
相信熟悉ArcGIS 10.X系统的朋友接触ArcGIS Pro或者QGIS的上手难度都很低,因此向大家分享我最近才注意到的一些ArcGIS Pro小的知识点或者注意事项等,用来查缺补漏。如果是GIS新手小白,建议先去了解GIS相关理论基础,再摸索GIS相关软…...
运维仙途 第1章 灵机突现探监控
第1章 灵机突现探监控 情节梗概 凌运维本是青云门杂役弟子,负责看守藏经阁灵脉枢纽。某日子夜,护山大阵突然灵力紊乱,阁中古籍无风自动。危急时刻,他意外触发祖师留下的「混沌钟」,获得观测灵脉状态的能力… 技术映…...
深入解析Java架构师面试:从核心技术到AI应用
深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…...