记录Vue使用代理的方式解决前端跨域问题

560 阅读2分钟

Vue 解决前后端跨域问题

什么是跨域?

跨域是指跨域名的访问,以下情况都属于跨域:
跨域原因说明示例
域名不同www.tmall.comwww.taobao.com
域名相同,端口不同www.tmall.com:8080www.tmall.com:8081
二级域名不同pages.tmall.comchaoshi.tmall.com

如果域名和端口都相同,但是请求路径不同,不属于跨域,如:

www.tmall.com/pages

www.tmall.com/chaoshi

而我们如果是通过 80端口 去访问 8080端口 ,这属于域名相同端口不同,就产生了跨域请求。

为什么会有跨域问题?

跨域请求不一定有跨域问题
	比如说:我们在使用百度搜索的时候,点击会跳转到其他网站。

因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能使用当前页同域名的路径,这能有效的阻止跨站攻击。

因此,跨域问题是针对于ajax的一种限制。

解决跨域问题的方案

Jsonp
/** 最早的解决方案,利用script标签可以跨域的原理实现 */

/** 优缺点 */
它的兼容性比较好,在更加古老的浏览器中都可以运行,
但是它只支持GET请求而不支持POST等其他类型的HTTP请求,
而且jsonp在调用失败的时候不会返回各种HTTP状态码,
还有是安全性不高,假如jsonp的服务器存在页面注入漏洞,那么所有调用这个jsonp的网站都会存在漏洞,无法把危险控制在一个域名下。
代理模式
/** 利用代理把跨域变为不跨域 */

/** 优缺点 */
可以支持各种请求方式,但是需要进行额外的配置,如果说前端解决跨域问题,那么使用代理是比较不错的。
CORS
/** 规范化的跨域请求解决方案,安全可靠 */

/** 优缺点 */
在服务端进行控制是否允许跨域,支持各种请求方式的同事可自定义规则,会产生额外的请求。

使用代理的方式解决跨域问题

// 首先需要在根目录下找到vue.config.js文件,如果没有该文件就手动创建一个

// vue.config.js 文件中 - 这里演示了配置多个代理

/**
 * 可以在此进行一些配置,解决跨域问题
 */
module.exports = {
    // 设置开发服务器
    devServer: {
        // 配置代理
        proxy: {
            // 设置需要拦截的请求路径
            '/api_1': {
                // 代理的目标地址
                target: 'http://127.0.0.1:5000',
                // 是否改变发送请求的地址
                changeOrigin: true,
                // 是否重写地址
                pathRewrite: {
                    '^/api_1': ''
                }
            },
            '/api_2': {
                // 代理的目标地址
                target: 'http://127.0.0.1:5001',
                // 是否改变发送请求的地址
                changeOrigin: true,
                // 是否重写地址
                pathRewrite: {
                    '^/api_2': ''
                }
            }
        }
    }
}

// 在使用axios发送请求的时
// “/api_1” 前面的请求路径可以不写,默认会有的
axios.get("/api_1").then((res) => {
    console.log(res);
});
axios.get("/api_2").then((res) => {
    console.log(res);
});