跨域访问指的是在浏览器上访问不同源(不同协议、不同域名、不同端口)的资源。通过浏览器的同源策略,JavaScript 代码只能访问到与当前页面同源的资源,对于不同源的资源,浏览器会阻止 JavaScript 访问。
不同二级域名跨域指的是同一域名下的不同二级域名之间的跨域访问,比如 a.example.com 和 b.example.com 之间的跨域访问。
为什么会存在跨域问题?
跨域问题源于浏览器的同源策略(Same-Origin Policy)。同源策略要求浏览器只允许与当前页面同源的脚本访问,如果两个网页同源,它们就可以相互访问,否则就会出现跨域问题。
解决方案
跨域问题可以通过以下几种方式进行解决。
CORS(Cross-Origin Resource Sharing)允许服务器向跨域访问的页面发送一个允许跨域请求的响应头,从而绕过浏览器的同源策略。
服务器端的代码如下:
const express = require('express')
const app = express()
app.use(function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*")
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
next()
})
app.get('/getData', (req, res) => {
res.send({data: 'hello world'})
})
app.listen(3000, () => {
console.log('server is running at http://localhost:3000')
})
前端的代码如下:
fetch('http://localhost:3000/getData')
.then(res => res.json())
.then(data => console.log(data))
使用 JSONP(JSON with Padding)可以绕过浏览器的同源策略,JSONP 的基本原理是动态创建 script 标签,通过 script 标签的 src 属性实现跨域访问。
前端的代码如下:
function handleData(data) {
console.log(data)
}
const script = document.createElement('script')
script.src = 'http://localhost