cors跨域_通过中间件设置cors跨域,让跨域资源共享变得更简单

上一篇文章《详解CORS跨域内部机制,帮助前端克服浏览器同源策略》作者详细介绍了如何利用cors进行接口跨域,其中服务器需要设置几个响应头。显然,这是一个很通用的功能,所以这篇文章我们把它封装成一个中间件。

我们接着上篇文章的demo继续开发,在上篇文章中我们采用koa做服务端,那么我们尝试封装一个koa的中间件。

封装

7b67b82aaa29f468060451e62f7978fe.png

图1

如图1,我们需要做的工作就是把图中红色区域的代码封装成一个中间件,我们把这个中间件代码放在cors.js文件中。

ccb04b1457abdd0e44e6e7cd1c74392c.png

图2

cors请求头需要可以配置,所以参数可以通过中间件传进去。图2中options的每个属性对应每个cors头信息的配置。

33745195a8ebdffa44755b455c3edb65.png

图3

我们需要判断一下是否是option请求,因为非简单请求发送的option请求主要是用来判断是否能进行cors跨域并不是真正用来请求数据的,所以这里需要分开处理。

b8252942f751861a3ac52c56370cc8b2.png

图4

首先处理origin,分为以下几种情况:

  • 如果options.origin没有配置或者配置为*,都直接设置*;
  • 如果options.origin为字符串,直接设置origin;
  • 如果options.origin为数组,把它变成字符串再设置;
  • 如果options.origin为正则表达式,并且匹配正确,设置请求头带来的origin;
  • 如果options.origin为函数,并且返回true,也设置请求头带来的origin;
ca1405e2d48bfe7e31de06f562c223d7.png

图5

图5所示,携带cookie,只要设置options.credentials为true即可。

b316e6beb22c4e46c1732d7f014a293b.png

图6

图6处理cors请求方法配置,如果是数组,就把它转化为字符串。

ad850f4d284d068f2bea8efa618f2d3d.png

图7

allowHeaders和ExposeHeaders配置的设置一样,如图7所示。

e426d33b001301d65bd484e5ff0c0853.png

图8

Access-Control-Max-Age单位是秒,此处判断类型是数字才设置,字符串也是可以的。

76fcb23ddc993d28d077382aec5413c3.png

图9

因为是option请求,所以在如图8所示位置就可以让其直接返回,此处也可以加一个配置,判断option请求是否需要继续向下处理。

fd9555426bb43301a6b46c6f24fce213.png

图10

在不是option请求时,我们也需要配置cors信息头。即使是非简单请求的第二个请求,如果不配置浏览器也会报错。

58d6340ad826de5f220acb76f3e4db17.png

图11

只需要配置origin、credentials和exposedHeaders就可以了。

使用案例如下:

5fd2924dedcca6c4520b96bd97c7d0aa.png

图12

总结

利用中间件可以使这部分逻辑配置化和公共化,使用更加方便。cors跨域方案看似蛮简单的,但是坑很多,如果不亲自踩踩,可能影响不会那么深刻。

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值