Node.js设置CORS跨域请求中多域名白名单的方法
允许跨域请求,主要就是配置Response响应头中的 Access-Control-Allow-Origin 属性为你允许该接口访问的域名。
最常见的设置是:
res.header('Access-Control-Allow-Origin', '*');res.header('Access-Control-Allow-Credentials', 'true'); // 允许服务器端发送Cookie数据
然而,这样的设置是最简单粗暴,同时也是最不安全的。它表示该接口允许所有的域名对它进行跨域请求。然而,在一般实际业务中,都希望该接口只允许对某一个或几个网站开放跨域请求权限,而非全部。
那么,聪明的你肯定想着,多域名白名单还不简单吗,写个正则就好啦?再不行,直接配置 Access-Control-Allow-Origin 属性为用逗号分隔的多个域名不就好了吗?
就像下面这样:
res.header('Access-Control-Allow-Origin', '*.666.com');// 或者如下res.header('Access-Control-Allow-Origin', 'a.666.com,b.666.com,c.666.com');
很遗憾地告诉你,这样的写法是无效的。在Node.js中,res的响应头Header中的 Access-Control-Allow-Origin 属性不能匹配除 (*) 以外的正则表达式的,域名之间不能也用逗号分隔。也就是说, Access-Control-Allow-Origin 的属性值只允许设置为单个确定域名字符串或者 (*)。
既然 Access-Control-Allow-Origin 属性已经明确不能设置多个域名,那么我们只得放弃这条路了。
最流行也是最有效的方法就是,在服务器端判断请求的Header中Origin属性值(req.header.origin)是否在我们的域名白名单列表内。如果在白名单列表内,那么我们就把 Access-Control-Allow-Origin 设置成当前的Origin值,这样就满足了Access-Control-Allow-Origin 的单一域名要求,也能确保当前请求通过访问;如果不在白名单列表内,则返回错误信息。
这样,我们就把跨域请求的验证,从浏览器端转移到服务端来了。对Origin字符串的验证就变成了相当于常规字符串的验证,我们不仅可以使用数组列表验证,还可以使用正则匹配。
具体代码如下:
// 判断origin是否在域名白名单列表中
function isOriginAllowed(origin, allowedOrigin) { if (_.isArray(allowedOrigin)) { for (let i = 0; i < allowedOrigin.length; i++) { if (isOriginAllowed(origin, allowedOrigin[i])) { return true; } } return false; } else if (_.isString(allowedOrigin)) { return origin === allowedOrigin; } else if (allowedOrigin instanceof RegExp) { return allowedOrigin.test(origin); } else { return !!allowedOrigin; }}
const ALLOW_ORIGIN = [ // 域名白名单 '*.233.666.com', 'hello.world.com', 'hello..*.com'];
app.post('a/b', function (req, res, next) { let reqOrigin = req.headers.origin; // request响应头的origin属性
// 判断请求是否在域名白名单内 if (isOriginAllowed(reqOrigin, ALLOW_ORIGIN)) { // 设置CORS为请求的Origin值 res.header("Access-Control-Allow-Origin", reqOrigin); res.header('Access-Control-Allow-Credentials', 'true');
// 你的业务代码逻辑代码 ... // ... } else { res.send({ code: -2, msg: '非法请求' }); }});
Oh yeah,简直完美~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
本文整理自 作者:子匠_Zijor 的文章
Node.js设置CORS跨域请求中多域名白名单的方法相关推荐
- Vue.js跨域请求配置、Node.js设置允许跨域
Vue跨域配置 在Vue项目目录中打开config/index.js,在proxyTable中添写如下代码: // 跨域处理proxyTable: {'/api': { // 匹配所有以 '/api' ...
- springboot 添加允许跨域_springboot设置cors跨域请求的两种方式
1.第一种: public class CorsFilter extends OncePerRequestFilter { static final String ORIGIN = "Ori ...
- HTTP中CORS跨域请求的实现(C++|Qt框架实现)
目录 背景 关键 演示及源码 背景 HTTP中CORS跨域请求,可以获取其他服务器的数据: 这里用Qt框架实现! 逻辑如下: 浏览器访问127.0.0.1:80端口!80端口请求了127.0.0.1: ...
- 详细记录如何在跨域请求中携带cookie
1. 搭建环境 1.生成工程文件 npm init 2.安装 express npm i express --save 3.新增app1.js,开启服务器1 端口:3001 const express ...
- js原生ajax跨域请求,封装一个原生js的ajax请求,支持IE9CORS跨域请求
前言 关于纯js的ajax请求,我之前有文章写过, https://www.haorooms.com/post/js_ajax_chun , 关于CORS跨域资源共享,我也有文章写过, https:/ ...
- corspost请求失败_vue项目CORS跨域请求500错误,post请求变options请求
vue项目CORS跨域请求500,post请求变options请求,到底是什么情况. 提示:以下内容是一个非专业开发的我对跨域的理解,并不10分准确. 一.先介绍为什么明明发送的是Post请求,为什么 ...
- CORS——跨域请求那些事儿
[本期嘉宾介绍]睿得,具有多年研发.运维.安全等IT相关从业经历.目前从事CDN.存储.视频直播点播的技术支持.喜爱钻研,喜爱编码,喜爱分享. 在日常的项目开发时会不可避免的需要进行跨域操作,而在实际 ...
- java重定向跨域问题_重定向 CORS 跨域请求
TL;DR 非简单请求不可重定向,包括第一个preflight请求和第二个真正的请求都不行. 简单请求可以重定向任意多次,但如需兼容多数浏览器,只可进行一次重定向. 中间服务器应当同样配置相关 COR ...
- SpringBoot2.1.5 (22)--- SpringBoot设置支持跨域请求
SpringBoot2.1.5 (22)--- SpringBoot设置支持跨域请求 现代浏览器处于安全的考虑,在http/https请求时必须遵守同源策略,否则即使跨域的http/https 请求, ...
最新文章
- cactiez----监控windows主机 server 2008 r2
- Android 线程 thread 两种实现方法!
- Java文件类boolean setExecutable(boolean exec_file,boolean owner_access)方法,带示例
- LeetCode 740. 删除与获得点数(排序+动态规划)
- [论文阅读] State-Relabeling Adversarial Active Learning
- 建设自己拥有的B2C网站一般需要什么样的插件以及大体花费
- Office 365强势来袭PART2:云中SharePoint
- 微软启动Menlo计划;英特尔手机处理器上市(每日关注20100505)
- csrss.exe和winlogon.exe引起cpu居高不下的解决办法
- 市场热门行驶证识别性能测评对比
- 【论文笔记】MOBA类游戏中的强化学习论文5篇
- 断点下载的主要知识总结。
- VSCode创建vue模板(快捷方便)
- 云计算简史_云计算的概念和发展历史
- 软件工程(2018)结对编程第2次作业
- 鲁四海解读中国大数据发展10大趋势5大挑战 —— 首席数据官联盟2016《中国大数据企业排行榜》发布会实录...
- Android中高级进阶开发面试题冲刺合集(四)
- tar 命令打包压缩tar.gz,不包含当前文件夹路径
- jQuery选择器之类选择器
- 哈密顿算子及拉普拉斯算子的基本性质及证明