@TOC跨域CORS请求携带cookies
跨域CORS请求携带cookies
Cookie 简介
- cookie是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域名的时候共享数据。 HTTP
- 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页
面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。
Koa Cookie 的使用
1、Koa 中设置 Cookie 的值
ctx.cookies.set(name, value, [options])
options 名称 | options 值 |
---|---|
maxAge | 一个数字表示从 Date.now() 得到的毫秒数 |
expires | cookie 过期的 Date |
path | cookie 路径, 默认是/ |
domain | cookie 域名 |
secure | 安全 cookie 默认 false,设置成 true 表示 只有 https 可以访问 |
httpOnly | 是否只是服务器可访问 cookie, 默认是true |
overwrite | 一个布尔值,表示是否覆盖以前设置的同名 的 cookie (默认是 false). 如果是 true, 在同 一个请求中设置相同名称的所有 Cookie(不 管路径或域)是否在设置此 Cookie 时从 Set-Cookie 标头中过滤掉。 |
2、Koa 中获取 Cookie 的值
ctx.cookies.get('name');
Koa 中设置中文 Cookie
console.log(new Buffer('hello, world!').toString('base64'));// 转换成 base64 字符 串:aGVsbG8sIHdvcmxkIQ==
console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());// 还原 base 64 字符串:hello, world!
搭建一个跨域请求的环境
A 服务器
const Koa = require('koa');
const KoaRouter = require('koa-router');
const serve = require('koa-static');
const path = require('path');
const app = new Koa();
const router = new KoaRouter();
app.use(serve(path.resolve(__dirname, './static'), {
index: 'index.html'
}))
router.get('/login', async (ctx, next) => {
// ctx.body = 'hello'
ctx.cookies.set('username','zhangsan',{
maxAge: 60 * 1000 * 60,
// path: '/login',
httpOnly: true
});
ctx.body = {
code: 200,
message: '登录成功'
}
})
router.get('/getUser', async (ctx, next) => {
var user = ctx.cookies.get('username');
console.log(user,'--------------')
ctx.body = {
code: 200,
user,
message: '获取用户成功'
}
})
app.use(router.routes());
app.listen(8088, () => {
console.log(8088)
})
B 服务器
const Koa = require('koa');
const KoaRouter = require('koa-router');
const app = new Koa();
const router = new KoaRouter();
app.use(async (ctx, next) => {
ctx.set('Access-Control-Allow-Origin', 'http://localhost:8088'); //允许来自所有域名请求(不携带cookie请求可以用*,如果有携带cookie请求必须指定域名)
// ctx.set("Access-Control-Allow-Origin", "http://localhost:8080"); // 只允许指定域名http://localhost:8080的请求
ctx.set('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE'); // 设置所允许的HTTP请求方法
ctx.set('Access-Control-Allow-Headers', 'x-requested-with, accept, origin, content-type'); //字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段.
// 服务器收到请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。
ctx.set('Access-Control-Allow-Credentials', true); // 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。
// 当设置成允许请求携带cookie时,需要保证"Access-Control-Allow-Origin"是服务器有的域名,而不能是"*";
await next();
})
router.get('/anotherService', async (ctx, next) => {
ctx.body = {
code: 200,
msg: '8089'
}
})
app.use(router.routes());
app.listen(8089, () => {
console.log(8089)
})
前端
<div>
<button id="button">同源</button>
</div>
<div>
<button id="cross_button">非同源</button>
</div>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
const btn = document.querySelector('#button')
const cros_btn = document.querySelector('#cross_button')
axios.get("http://localhost:8088/login", {}).then(res => {
console.log(res)
})
// 同源
btn.onclick = function () {
axios.get("http://localhost:8088/getUser", {}).then(res => {
console.log(res)
})
}
// 非同源
cros_btn.onclick = function () {
axios.get("http://localhost:8089/anotherService", {}).then(res => {
console.log(res)
})
}
</script>