前端跨域解决方法整理

前言

跨域行为描述: 跨域发生的位置不是服务端,而是浏览器的一种行为,也就是说没有结果是浏览器拦截了

解决方式

1、方式一

res.setHeader(Access-Control-Allow-Origin, http://localhost:3000)

2、方式二(关于预检请求)

if (method == "OPTIONS" && url == "/api/users") {

            res.setHeader(Access-Control-Allow-Credentials, true);
            res.writeHead(200, {
               "Access-Control-Allow-Origin": "http://localhost:3000",
               "Access-Control-Allow-Headers": "X-Token,Content-Type",
               "Access-Control-Allow-Methods": "PUT"
           });
           res.end();
        }

3. 关于cookie的解决方案

// index.html 客户端
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    (async () => {
        // 携带cookie
        axios.defaults.baseURL = http://localhost:4000

        // axios.defaults.withCredentials = true
        await axios.post("/api/save", a=1&b=3, {
            headers: {
                Content-Type: application/x-www-form-urlencoded,
            },
        })
    })()
</script>

// app.js 服务端

if (method == "OPTIONS" && url == "/api/users") {

   res.setHeader(Access-Control-Allow-Credentials, true);
   res.writeHead(200, {
     "Access-Control-Allow-Origin": "http://localhost:3000",
     "Access-Control-Allow-Headers": "X-Token,Content-Type",
     "Access-Control-Allow-Methods": "PUT"
   });
   res.end();
}
if (method == "post" && url == "/api/users") {
    //设置cookie
    res.setHeader(Set-Cookie, cookie1=va222;)
    res.end(aa);
}

4. 服务端反向代理

// 服务端
var express = require(express);
const proxy = require(http-proxy-middleware)

const app = express()
app.use(/api, proxy({ target: http://localhost:4000, changeOrigin: false }));

5. jsonp 方式

经验分享 程序员 微信小程序 职场和发展