前端常用跨域解决方案

笔者对跨域的知识比较模糊,只知道jsonp cors和webpack中设置proxy,现系统复习一下

 什么叫浏览器的同源策略?

协议 域名 端口号 三者都一样就是同源,只要有一个不同就是跨域

1、jsonp

script   img    link   iframe   不存在跨域请求的限制

引入cdn jquery.min.js    html可以访问到此js, jsonp就是利用这个

 html+ajax请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSONP练习</title>
</head>
<body>
    <script src="https://lib.baomitu.com/jquery/3.5.1/jquery.min.js"></script>
    <!-- <script src="./JSONP.js"></script> -->
    <script>
        $.ajax({
            url:'http://127.0.0.1:8001/list',
            method:'get',
            dataType:'jsonp', // 执行的是jsonp的请求
            success:res=>{
                console.log(res)
            }
        })
    </script>
</body>
</html>

node请求

let express = require('express')
app = express()
app.listen('8001',_ =>{
    console.log('8001成功开启')
})
app.get('/list',(req,res)=>{
    // 请求传递过来一个callback
    let { callback = Function.prototype} = req.query
    let data = {
        code:0,
        message:'JSONP请求成功'
    }
    res.send(`${callback}(${JSON.stringify(data)})`)
})

 JSONP的缺点:JSONP只能处理GET请求,安全性不高,容易被请求拦截改请求

2.CORS跨域资源共享

 在实际项目过程中经常会遇到跨域的请求报错

 

客户端发送请求

 

 node服务端允许跨域(通过设置响应头header允许哪个源可以向它跨域传输)

 

 客户端axios设置

axios.default.baseURL = "http://127.0.0.1:8888";
axios.default.withCredential = true; //允许跨域携带cookic信息,axios默认是请求的时候不会带上cookie的
axios.default.headers['Content-Type'] = 'application/x-www-form-urlencoded';
axios.default.transformRequest = function(data){ //transformRequest在向服务器发送前,修改请求数据
    if(!data) return data;
    let result = ``;
    for(let attr in data){
        if(!data.hasOwnProperty(attr)) break;
        result += `&${attr}=${data[attr]}`;
    }
    return result.substring(1); //请求结果变成aa=xxx&bb=xxx
}
axios.interceptors.response.use(function onFulfilled(response){
    return response.data;
},function onRejected(reason){
    return Promise.reject(reason);
});
axios.default.validateStatus = function (status){ //状态码
    return /^(2|3)d{2}$/.test(status);
}

 服务端常用设置相关的头信息(需要处理options试探性请求)

 http proxy =>webpack webpack-dev-server

nginx 反向代理 

原文地址:https://www.cnblogs.com/gengzhen/p/14056153.html