koa2-cors应答跨域请求实现

摘要:
它也是一个逗号分隔的字符串,指示服务器支持的所有标头信息字段。ctx集合;//服务器收到请求后,会检查“来源”、“访问控制请求方法”和“访问控制要求标头”字段,确认允许跨源请求,然后响应//“内容类型”表示媒体类型信息ctx集;//此字段是可选的。它的值是一个布尔值,指示是否允许发送cookie。默认情况下,CORS请求中不包含cookie//当设置为允许请求携带cookie时,需要确保“访问控制允许来源”是服务器的域名,而不是“*”;ctx。设置;//此字段是可选的。用于指定此预检验请求的有效期。该单位排名第二。
var koa = require('koa');
var app = new koa();
var router = require('koa-router')();
// CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。
// 下面以koa2-cors为例,
const cors = require('koa2-cors');
// 具体参数我们在后面进行解释
app.use(cors({
    origin: function (ctx) {
        if (ctx.url === '/test') {
            return "*"; // 允许来自所有域名请求
        }
        return 'http://localhost:8080'; / 这样就能只允许 http://localhost:8080 这个域名的请求了
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'POST', 'DELETE'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}))
router.post('/', async function (ctx) {
    ctx.body = '恭喜 __小简__ 你成功登陆了'
});
app
    .use(router.routes())
    .use(router.allowedMethods());
app.listen(3000);

2、下面我们在http://localhost:8080发送请求进行测试

this.$axios.post('http://172.16.186.50:3000/', {})
                    .then((response) => {
                        console.log(response)
                    })
                    .catch(function (error) {
                        console.log(error);
                    });

koa2-cors应答跨域请求实现第1张

3、下面我们以具体的请求头信息解释上面的代码,也就是cors具体的实现过程

// 我们可以用下面的中间件理解app.use(cors({}))
app.use(async (ctx, next) => {
    // 允许来自所有域名请求
    ctx.set("Access-Control-Allow-Origin", "*");
    // 这样就能只允许 http://localhost:8080 这个域名的请求了
    // ctx.set("Access-Control-Allow-Origin", "http://localhost:8080"); 
    // 设置所允许的HTTP请求方法
    ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE");
    // 字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段.
    ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type");
    // 服务器收到请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。
    // Content-Type表示具体请求中的媒体类型信息
    ctx.set("Content-Type", "application/json;charset=utf-8");
    // 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。
    // 当设置成允许请求携带cookie时,需要保证"Access-Control-Allow-Origin"是服务器有的域名,而不能是"*";
    ctx.set("Access-Control-Allow-Credentials", true);
    // 该字段可选,用来指定本次预检请求的有效期,单位为秒。
    // 当请求方法是PUT或DELETE等特殊方法或者Content-Type字段的类型是application/json时,服务器会提前发送一次请求进行验证
    // 下面的的设置只本次验证的有效时间,即在该时间段内服务端可以不用进行验证
    ctx.set("Access-Control-Max-Age", 300);
    /*
    CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
        Cache-Control、
        Content-Language、
        Content-Type、
        Expires、
        Last-Modified、
        Pragma。
    */
    // 需要获取其他字段时,使用Access-Control-Expose-Headers,
    // getResponseHeader('myData')可以返回我们所需的值
    ctx.set("Access-Control-Expose-Headers", "myData");
    await next();
})

4、理解的上面的代码,估计你也能猜到app.use(cors({}))里面的配置信息了。当然还有其他可选的信息,具体设置并无多大差别,在这就不多解释了。
5、注:我们还可以通过在前端配置代理的方式来实现跨域请求。

免责声明:文章转载自《koa2-cors应答跨域请求实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle- 表查询Javascript 计算请假天数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Access-Control-Allow-Origin跨域解决及详细介绍

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。 本文更新不及时,建议到原文地址浏览:跨域解决及详细介绍。 首先,跨域不是问题。是一种安全机制。 这是你在开发时、上线前就必须提前考虑到的安全问题并且采取合适的手段去避免这个问题带来的程序错误。 一、跨域是什么 跨域是浏览器加载了与当前域名、协议、端口不同另一站点...

解决:Access模糊匹配查询查不到数据

今天遇到一个可笑的问题,直接操作Access的SQL语句: Select * from table where txtTitle like '%数据%' 匹配竟然无效。后来才发现在Access中模糊匹配应该用*代替% Select * from table where txtTitle like '*数据*' 狂晕。。。...

redmine部署

1. 下载Redmine源代码这里利用git下载: git clone https://github.com/redmine/redmine 2. 安装配置MySQL已经安装过MySQL就不需要执行下面的命令: sudo apt-get install mysql-server mysql-client 配置redmine数据库和用户: mysql -u...

前端常见跨域解决方案(全)

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。 跨域的根本原因就是浏览器,所以在后台是不存去前端一样上的跨域的,后台调后台是不会跨域的,但是必须网络是通的 广义的跨域: 1.) 资源跳转: A链接、重定向、表单提交 2.) 资源嵌入: <link>、<script>、<img>...

tp框架总体学习总结(一)

一、TP框架的下载和安装 Tp框架下载网址:http://www.thinkphp.cn/ 在wamp的www目录下创建一个目录tpshop目录 1. 将下载好的包压缩后将文件包里的所有文件复制到创建项目的根目录(tpshop)中 |Application |Public |ThinkPHP |.htaccess |composer.json |index...

access数据库删除两个日期之间 的数据 SQL语句

sql2005中sql语句为 DELETE FROM table WHERE ([date] BETWEEN '2011 - 9 - 19 0 : 00 : 00 ' AND '2011 - 9 - 20 0 : 00 : 00') 词语法是正确的,发现再access中没有影响相关行数,解决方法在日期前后加上#,语法为: delete from table...