话很少说,一个字,干!
前端配置以下:
axios.defaults.withCredentials = true; //配置为tru
openid: 'oJ0mVw4QrfS603gFa_uAFDADH2Uc',
date: '2018-11-21'
}).then(function (response) {
console.log(response)
})
前端配置withCredentials = true 后端的跨域也须要配置
app.use(async (ctx, next) => {
ctx.set('Access-Control-Allow-Origin', ctx.request.header.origin);
ctx.set('Access-Control-Allow-Credentials', true);
await next();
});
//防止每次请求都返回Access-Control-Allow-Methods以及Access-Control-Max-Age,
//这两个响应头实际上是没有必要每次都返回的,只是第一次有预检的时候返回就能够了。
app.use(async (ctx, next) => {
if (ctx.method === 'OPTIONS') {
ctx.set('Access-Control-Allow-Methods', 'PUT,DELETE,POST,GET');
ctx.set('Access-Control-Max-Age', 3600 * 24);
ctx.body = '';
}
await next();
});
前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提高思惟能力,群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。
实例展现完了,咱们来说讲都是怎么回事
**withCredentials:**默认状况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证实等)。经过将withCredentials属性设置为true,能够指定某个请求应该发送凭据。
默认值为false。
true:在跨域请求时,会携带用户凭证
false:在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie
当配置了 withCredentials = true时,必须在后端增长 response 头信息Access-Control-Allow-Origin,且必须指定域名,而不能指定为*!!!
那么问题就来了,如果多个域名呢? 我配置的是任意域名均可以访问,可是这样并不安全。建议作法是建立一个数组,每次去检测域名是否在数组内,存在则继续
讲到这里了,那么延伸一下 post请求下的options
options 它是一种探测性的请求,经过这个方法,客户端能够在采起具体资源请求以前,决定对该资源采起何种必要措施,或者了解服务器的性能。
前台跨域post请求,因为CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,若是匹配则正式发送post请求。
每一次非简单请求都会实际上发出两次请求,一次预检一次真正请求,这就比较损失性能了。
// 样式相关的测试用例
it('icon 默认的 order 是 1', () => {
const wrapper = mount(Button, {
propsData: {
icon: 'setting'
}
})
const vm = wrapper.vm
const icon = vm.$el.querySelector('svg')
expect(getComputedStyle(icon).order).to.eq('1')
})
复制代码
在查看了 Vue Test Utils 的文档以后。查询到有一个属性 attachToDocument: true, 能够设置,试着把元素放置到 DOM 之中。
复制代码
// 样式相关的测试用例 添加 attachToDocument: true 属性以后
it('icon 默认的 order 是 1', (www.fengshen157.com/) => {
const wrapper = mount(www.gcyl158.com Button, {
attachToDocument: true,
propsData: {
icon: 'setting'
}
})
const vm = wrapper.vm
const icon = vm.$el.querySelector(www.gcyL157.com'svg')
expect(getComputedStyle(www.haitianguo.cn icon).order).to.eq('1')
})
复制代码
但我添加了以后,仍然没法经过测试。根本缘由仍旧是没有使用 Karma 打开浏览器进行测试。
解决过程
配置 package.json
在 package.json 中添加依赖配置,以下图。
安装依赖
使用以下命令安装以前 package.json 中添加的依赖。
yarn add -D karma karma-chrome-launcher www.mingrenf178.com karma-mocha karma-sourcemap-loader karma-spec-reporter karma-webpack chai sinon sinon-chai
建立 karma.config.js
在 Vue Cli 3 的官方文档 webpack 相关章节中,能够查询到 Vue Cli 3 将 webpack.config.js 藏到了一个地方,即 /node_modules/@vue/cli-service/webpack.config.js。
因此就有了2图的中间件。 Access-Control-Max-Age: 86400 设置一个相对时间,在该非简单请求在服务器端经过检验的那一刻起,当流逝的时间的毫秒数不足Access-Control-Max-Age时,就不须要再进行预检,能够直接发送一次请求。前端