我们在使用vue-cli启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以localhost:8080来请求接口数据的,localhost是没有办法设置cookie的。
我们可以在vue-cli配置文件里面设置一个代理,跨域的方法有很多,通常需要后台来进行配置。我们可以直接通过node.js代理服务器来实现跨域请求。
在vue-cli项目中的config文件夹下的index.js配置文件中,dev长这样子:
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
cssSourceMap: false
}
服务器提供的接口如果长这样https://www.exaple.com/server_new/login
,我们把域名提取出来如https://www.exaple.com
;
在config中新建一个文件命名为proxyConfig.js:
module.exports = {
proxy: {
'/apis': { //将www.exaple.com印射为/apis
target: 'https://www.exaple.com', // 接口域名
changeOrigin: true, //是否跨域
pathRewrite: {
'^/apis': '' //需要rewrite的,
}
}
}
}
如果本身的接口地址就有 '/api' 这种通用前缀,也就是说https://www.exaple.com/api
,就可以把 pathRewrite
删掉。
config
文件夹下的index.js
引入proxyConfig.js
:
var proxyConfig = require('./proxyConfig')
config
文件夹下的index.js
中的dev
改成:
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: proxyConfig.proxy,
cssSourceMap: false
}
重启npm run dev会发现出现了:
这个时候已经设置好本地API代理了。
window
文件路径一般是C:\Window\System32\drivers\etc
,mac
则直接前往文件夹/etc/hosts
,打开hosts
文件,在这一段下面把localhost
设置进去
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 activate.adobe.com
127.0.0.1 practivate.adobe.com
127.0.0.1 lmlicenses.wip4.adobe.com
127.0.0.1 lm.licenses.adobe.com
127.0.0.1 na1r.services.adobe.com
127.0.0.1 hlrcv.stage.adobe.com
localhost www.exaple.com
此时我们已经完全解决了跨域问题,以及本地测试后台无法向我们本地环境设置cookie
的情况了。
写一个config.js
文件,作为项目地址的配置。
//项目域名地址
const url = 'https://exaple.com';
let ROOT;
//由于封装的axios请求中,会将ROOT打包进去,为了方便之后不再更改,判断了当前环境,而生成的不同的ROOT
if (process.env.NODE_ENV === 'development') {
//开发环境下的代理地址,解决本地跨域跨域,配置在config目录下的index.js dev.proxyTable中
ROOT = "/apis"
} else {
//生产环境下的地址
ROOT = url;
}
exports.PROXYROOT = url; //代理指向地址
exports.ROOT = ROOT;
这里暴露出去了两个接口,一个作为代理指向地址,也就是真正的请求地址,一个则为我们的ajax
请求的地址。
我们将ROOT
引入我们配置的ajax
中,再将proxyConfig.js
修改如下:
const config = require("../src/fetch/config"); //路径你们改下
module.exports = {
proxy: {
[config.ROOT]: { //将www.exaple.com印射为/apis
target: config.PROXYROOT,, // 接口域名
secure: false, // 如果是https接口,需要配置这个参数
changeOrigin: true, //是否跨域
pathRewrite: {
[`^${config.ROOT}`]: '' //需要rewrite的
}
}
}
}
之后不管是生产环境,还是开发环境,都不用再修改我们的请求地址了。
也就是说,之前我们的方法,在npm run dev
的时候,ajax
请求接口地址需要带上/apis
,而如果我们在npm run build
的时候,则需要将ajax
接口地址改为真正的地址www.exaple.com
,这样极其不方便,每次都要改。那我们便通过process.env.NODE_ENV
来判断环境,从而导出不一样的接口。
相比前端的设置而言,后端的解决方案就简单多了,我们只需要下载一个python包,进行一些设置,就可以完成跨域访问。
这个包是用来解决django跨域的,很多语言中,如C#,Java都有对应的跨域包可以安装,而且名字带有cors
通过pip进行安装:
pip3 install django-cors-headers
在安装完成后需要进行一些settings的设置:
INSTALLED_APPS = [
...
'corsheaders',
...
]
# 添加中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',# 默认
'django.contrib.sessions.middleware.SessionMiddleware', # 默认
'corsheaders.middleware.CorsMiddleware',# 默认
# 注意顺序,即在上一个的下面
'django.middleware.common.CommonMiddleware', # 新增 ✔
'django.middleware.csrf.CsrfViewMiddleware',# 默认
'django.contrib.auth.middleware.AuthenticationMiddleware',# 默认
'django.contrib.messages.middleware.MessageMiddleware', # 默认
'django.middleware.clickjacking.XFrameOptionsMiddleware',# 默认
'django.middleware.common.CommonMiddleware',# 默认
]
# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'*'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
在这些设置完成后,同样可以解决跨域的问题。