前端須要都須要配置
後端相應配置什麼javascript
首先跨域方式不止這兩種 iframe.posetMessage form 表單也可。前端
====
項目地址 (https://github.com/L6zt/corssDomain-demo)
原理說明:java
什麼叫作jsonp請求,其實就至關於在頁面里加載遠程腳本資源,
加載完頁面就會執行裏面的函數,也就是爲何你會發現
jsonp 請求結果裏 jsonp1({a: 1}); jsonp1就是函數(只不過相似jquery 已經把這個函數 放在window下了),
jsonp1({a: 1}) 至關與執行函數,因此你就能拿到數據參數了。node
這個是xhr 2 提供跨域的方式
cors文檔
我後端node 服務器,照這個文檔寫的,純自手擼。
`const Koa = require('koa');
// 路由
const Router = require('koa-router');
//
const path = require('path');
//提供靜態文件服務
const koaStaticServer = require('koa-static-server');
// 打開瀏覽器
const opn = require('better-opn');
// 服務器 1
const wwwLocalhostComServer = new Koa();
// 服務器 2
const mLocalhostComServer = new Koa();jquery
// 跨域路由
const wwwCorsRouter = new Router({
prefix: '/cors'
});
// 非跨域路由
const wwwNotCorsRouter = new Router({
prefix: '/nm'
});
// jsonp 請求
const wwwJsonpRouter = new Router({
prefix: '/jsonp'
});
// 跨域接口git
wwwCorsRouter.use('/', (ctx, next) => {
const {request} = ctx;
const {header: { origin }, method} = request;
ctx.response.set('Access-Control-Allow-Origin', origin);
next();
}).post('/setCookie', (ctx, next) => {
const result = {github
flag: 1, data: { message: 'we set cookie in different domain', }
};
ctx.response.set('Access-Control-Allow-Credentials', 'true');
ctx.response.set('Set-Cookie', auth=love; Expries=${new Date(Date.now() + 60 * 60 * 24 * 10 * 1000)}; Path=/
);
ctx.cookies.set('inject', 'love', {json
expires: new Date(Date.now() + 60 * 60 * 24 * 10 * 1000),
});
ctx.response.set('Content-type', 'application/json');
ctx.body = JSON.stringify(result);後端
}).post('/normalData', (ctx, next) => {
const result = {跨域
flag: 1, data: { message: 'we like each other' }
}
ctx.response.set('Content-type', 'application/json');
ctx.body = JSON.stringify(result);
});
// 非跨域接口
wwwNotCorsRouter.use('/', (ctx, next) => {
ctx.response.set('Custom-Server-Sp', 'love');
next();
}).post('/data', (ctx, next) => {
const result = {
flag: 1, data: { message: 'we are not in the same domain', }
};
ctx.response.set('Content-type', 'application/json');
ctx.body = JSON.stringify(result);
});
// jsonp 接口
wwwJsonpRouter.get('/data', (ctx, next) => {
const {request} = ctx;
const {header: { origin }, method, query} = request;
const {callback} = query;
if (!callback) {
ctx.body = JSON.stringify({ flag: 0, message: '參數校驗失敗', }) return
} else {
// 至關與返回 js文件 // 文本內容 js文件 ctx.response.set('Content-type', 'application/javascript'); ctx.body = [ `${callback}(`, JSON.stringify({flag: 0, data: {payload: {key: 'love'}}}), ')' ].join('');
}
})
wwwLocalhostComServer.use((ctx, next) => {
const {request} = ctx;
const {header:{ origin , path}, method} = request;
// 對某些特殊 cors 作處理 詳情 mdn 文檔
if (method === 'OPTIONS') {
ctx.response.set('Access-Control-Allow-Origin', origin);
ctx.response.set('Access-Control-Request-Method' , 'POST');
ctx.response.set('Access-Control-Allow-Headers', 'Content-Type');
ctx.response.set('Access-Control-Allow-Credentials', true);
ctx.body = ''
} else {
next();
}
});
wwwLocalhostComServer.use(wwwCorsRouter.routes());
wwwLocalhostComServer.use(wwwNotCorsRouter.routes());
wwwLocalhostComServer.use(wwwJsonpRouter.routes());
mLocalhostComServer.use(koaStaticServer({
rootDir: path.join(__dirname, './m.assert')
}));
wwwLocalhostComServer.use(koaStaticServer({
rootDir: path.join(__dirname, './www.assert'),
}));
wwwLocalhostComServer.listen(7001, () => {
console.log(' -- *');
console.log('端口爲 7001的接口啓動了');
console.log(' --- ');
});
mLocalhostComServer.listen(7002, () => {
console.log(' -- *');
console.log('端口爲 7002的服務器啓動了');
console.log(' --- ');
opn('http://localhost:7002');});`