浅谈koa跨域问题及koa2-cors中间件

  • 什么是跨域
  • 跨域请求资源的方法
  • koa中如何设置跨域
  • koa2-cors应答跨域请求实现

什么是跨域

由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。存在跨域的情况:

网络协议不同,如http协议访问https协议。

端口不同,如80端口访问8080端口。

域名不同,如qianduanblog.com访问baidu.com。

子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com。

域名和域名对应ip,如www.a.com访问20.205.28.90.

跨域请求资源的方法

  1. JSONP跨域
  2. nginx反向代理
  3. 服务器端修改heade
  4. document.domain
  5. window.name
  6. postMessage

koa中如何设置跨域

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')可以返回我们所需的值//https://www.rails365.net/articles/cors-jin-jie-expose-headers-wuctx.set("Access-Control-Expose-Headers", "myData");await next();
})

这一部分我认为这篇文章讲的很好浅谈Koa2框架利用CORS完成跨域ajax请求。

koa2-cors应答跨域请求实现

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);

浅谈koa跨域问题及koa2-cors中间件相关推荐

  1. 浅谈postMessage跨域通信与localStorage实现跨域共享

    我们可能有需要在多个域名之间共用同一个localStorage的需要 一.我们先测试不同域名之间的通信 1.有 child.html 如下,代码中 window.parent.postMessage( ...

  2. 浅谈cookie跨域的解决方案(domain)

    sso单点登录跨域cookie共享 首先了解cookie的两个属性 domain-域 通过设置这个属性可以使多个web服务器共享cookie.domain属性的默认值是创建cookie的服务器的主机名 ...

  3. 浅谈cookie跨域的解决方案——document.domain

    cookie的名/值对中的值不允许出现分号.逗号和空白符,因此在设置cookie前要用encodeURIComponent()编码,读取时再用decodeURIComponent()解码. cooki ...

  4. 浅谈C++跨模块释放内存

    浅谈C++跨模块释放内存 一, MT改MD 二, DLL提供释放接口 三, 使用进程堆申请内存 在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存.这一点,我们在很多开源库或者平常项目中也 ...

  5. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors

    Ajax操作如何实现跨域请求? Ajax (XMLHttpRequest)请求受到同源策略的限制. Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外XMLHttpReque ...

  6. PHP下ajax跨域的解决方案之CORS

    PHP下ajax跨域的解决方案之CORS 参考文章: (1)PHP下ajax跨域的解决方案之CORS (2)https://www.cnblogs.com/jkko123/p/6294625.html ...

  7. C#进阶系列——WebApi 跨域问题解决方案:CORS

    C#进阶系列--WebApi 跨域问题解决方案:CORS 参考文章: (1)C#进阶系列--WebApi 跨域问题解决方案:CORS (2)https://www.cnblogs.com/landea ...

  8. 深入跨域问题(2) - 利用 CORS 解决跨域

    阅读目录: 深入跨域问题(1) - 初识 CORS 跨域资源共享: 深入跨域问题(2) - 利用 CORS 解决跨域(本篇) 深入跨域问题(3) - 利用 JSONP 解决跨域 深入跨域问题(4) - ...

  9. 跨域学习笔记2--WebApi 跨域问题解决方案:CORS

    自己并不懂,在此先记录下来,留待以后学习... 正文 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题.本篇主要从实例的角度分享下CORS解决跨 ...

最新文章

  1. 麦肯锡《2020年人工智能状况》报告:企业收入增长,AI真的出了力
  2. XHTML标准下的100%高度问题
  3. 前端学习(2189):Promise的介绍和基本使用二
  4. android gradle 语法,Gradle 1.语法
  5. 如何用VS2005制作Web安装程序
  6. Linux CentOS 7 安装 MySQL(5.7.26)
  7. 排序算法--冒泡排序
  8. 五阶段--使用 Kibana 操作 ES/ 搜索
  9. 简单线性相关案例-求相关系数
  10. 体验服和平精英服务器维护,和平精英:体验服申请入口
  11. HML_FwLib_8051使用补充说明
  12. 打印预览的线条粗细问题
  13. pyhon3爬取百度搜索结果
  14. TPS和QPS 并发量区别;日活 访问量 活跃度
  15. 关于做一个有价值的人的思考(1,财富扮演什么角色)
  16. 英语计算机主板接口有,主板上常见英文的解释
  17. 福禄克FLUKE DTX-1800和DSX2-8000系列电缆认证分析仪如何导出测试报告?
  18. pytorch使用gpu(linux服务器上)
  19. linux和android比较大小写,不区分大小写的串比较---Windows下的stricmp和Linux下的strcasecmp, 遇到了, 所以记录一下!...
  20. java new short_Java中的Java.Lang.Short类 - Break易站

热门文章

  1. android:解决小米手机相机返回照片旋转问题
  2. 解决rimraf使用时提示unexpected token “.”
  3. sealed密封类的使用
  4. 总结:会签任务一票否决
  5. UVa1646 Edge Case
  6. WMS仓储管理系统源码
  7. 上海华为OD--JAVA面试总结
  8. 在线增加网站PV量单页源码
  9. 2024武汉大学计算机考研信息汇总
  10. python3 链表_Python3链表实现