跨域CORS请求携带cookies

@TOC跨域CORS请求携带cookies

跨域CORS请求携带cookies

Cookie 简介

  • cookie是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域名的时候共享数据。 HTTP
  • 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页
    面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何 关系的。

Koa Cookie 的使用

1、Koa 中设置 Cookie 的值

ctx.cookies.set(name, value, [options])
options 名称options 值
maxAge一个数字表示从 Date.now() 得到的毫秒数
expirescookie 过期的 Date
pathcookie 路径, 默认是/
domaincookie 域名
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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值