1.跨域的產生,
瀏覽器為了保證用戶信息的安全,防止惡意的網站竊取數據,所以所有瀏覽器都實行同源政策,而同源所指的是協議相同、域名相同和端口不同,而產生跨域就是因為同源問題,當其中一個不同時,就導致跨域的產生
2.jsonp跨域
jsonp是服務器與客戶端跨源通信的常用方法,特點是簡單適用,老式瀏覽器全部支持,而服務器改造小
它的基本思想是:網頁通過添加一個 <script> 元素,向服務器請求JSON數據,這種做法不受同源政策限制。服務器收到請求后,將數據放在一個指定名字的回到函數里傳回來。首先,網頁動態插入<script> 元素,由它向跨源網址發出請求。代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
//動態插入script 標簽
var script = document.createElement('script')
script.type = 'text/javascript'
script.src = "http://localhost:8080/login?user=admin&callback=handleCallback"
document.head.appendChild(script)
function handleCallback(res) {//回調函數
console.log(JSON.stringify(res))
}
</script>
</body>
</html>
//后台node代碼
var http=require('http')
var qs=require('querystring')
var server=http.createServer()
server.on('request',function(req,res){
var params=qs.parse(req.url.split('?')[1]) //獲取URL的參數
var fn=params.callback //獲取handleCallback
//jsonp返回設置
console.log(fn+'('+JSON.stringify(params)+')')
res.writeHead(200,{'Content-Type':'text/javascript'})
res.write(fn+'('+JSON.stringify(params)+')') //調用handleCallback 函數並傳入參數
res.end()
})
server.listen('8080')
console.log('Server is running at port 8080')
3.后台直接設置
在后台配置文件,插入如下代碼。如node項目的app.js 文件
//實現跨域
app.use((req,res,next)=>{
res.header("Access-Control-Allow-Credentials", "true");
// res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
if (req.method == 'OPTIONS') {
res.send(200); /*讓options請求快速返回*/
} else {
next();
}
})
4.CORS跨域資源共享
參考阮一峰老師的文章 http://www.ruanyifeng.com/blog/2016/04/cors.html
5.代理跨域
如webpack 的proxy 代理實現跨域 參考下面的代碼
dev: { env: require('./dev.env'), port: 8080, autoOpenBrowser: true, assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { '/api': { target: 'http://www.abc.com', //目標接口域名 changeOrigin: true, //是否跨域 pathRewrite: { '^/api': '/api' //重寫接口 } }, cssSourceMap: false }
