无法通过 Socket.IO 从 cookie 获取 Express 会话 ID

2024-04-24

我在 Node 中有一个典型的 Web 应用程序,它利用 Express 框架和会话中间件。我还将 Socket.io 用于应用程序的某些动态部分(目前,这是一种聊天机制,但这是无关的)。我已经能够成功地自行设置会话和socket.io,但希望将它们组合起来(例如:将套接字聊天消息与用户帐户相关联,而无需访问数据库)。

应该注意的是(我可以看到这是一个可能的问题点),我在不同的端口上运行两个 Express 服务器:一个用于常规 HTTP 流量,另一个用于 HTTPS 流量。但是,我让两台服务器都进行相同的配置并共享相同的会话存储。会话确实在 http 和 https 页面之间持续存在。会话最初是通过 HTTPS 提供的页面设置的,socket.io 页面是普通 HTTP。

我正在遵循位于的指南here http://www.danielbaulig.de/socket-ioexpress/实现我正在寻找的关于集成 socket.io 和会话的目标。但是,在授权函数中,尽管我的应用程序的基于会话的部分按预期工作,但 data.headers.cookie 从未设置。更奇怪的是,设置会话后,如果我执行console.log(document.cookie)在浏览器中,我得到一个空字符串,但是当我使用 Firefox 开发人员工具栏查看 cookie 时,会发现 Express 和 connect 都有一个 SID cookie。

这是服务器代码的相关部分:

var config = {
    ip          : "127.0.0.1",
    httpPort    : 2031,
    httpsPort   : 2032
};

var utils       = require("./utils"),
    express     = require('express'),
    fs          = require('fs'),
    parseCookie = require('./node_modules/express/node_modules/connect').utils.parseCookie,
    routes      = require('./routes')(config); 

var httpsOpts = {
    key : fs.readFileSync("cert/server-key.pem").toString(),
    cert: fs.readFileSync("cert/server-cert.pem").toString()
 };

var app             = express.createServer(),
    https           = express.createServer(httpsOpts),
    io              = require("socket.io").listen(app, { log: false}),
    helpers         = require("./helpers.js"),
    session         = new express.session.MemoryStore(),
    sessionConfig   = express.session({
        store   : session,
        secret  : 'secret',
        key     : 'express.sid',
        cookie  : {maxAge : 60 * 60 * 1000}
    }); //share this across http and https

configServer(app);
configServer(https);

//get SID for using sessions with sockets
io.set('authorization', function(data, accept){
    if(data.headers.cookie){
        data.cookie = parseCookie(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'];
    } else {
        return accept("No cookie transmitted", false);
    }

    accept(null, true);
});

io.sockets.on('connection', function(socket){
    //pull out session information in here
});

function configServer(server) {
    server.configure(function(){
        server.dynamicHelpers(helpers.dynamicHelpers);
        server.helpers(helpers.staticHelpers);
        server.set('view options', { layout: false });
        server.set('view engine', 'mustache');
        server.set('views', __dirname + '/views');
        server.register(".mustache", require('stache'));
        server.use(express.static(__dirname + '/public'));
        server.use(express.bodyParser());
        server.use(express.cookieParser());
        server.use(sessionConfig);
    });
}

这是客户端上的相关代码:

<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        var socket = io.connect('http://127.0.0.1'); //make sure this isn't localhost!
        socket.on('server', function(data){
            //socket logic is here
        });
    }
</script>

UPDATE

即使在使用 SocketIO 的页面的路由中手动设置 cookie(而不仅仅是会话变量)后,请求的 cookie 部分仍然不存在。


直到被告知查看客户端的初始化之前,我永远不会想到这一点。我将地址从 localhost 更改为显式 IP (127.0.0.1),现在 Cookie 与 Socket.IO 中的标头一起发送。我不确定这是否明显,因为我假设 localhost 无论如何都被映射到 127.0.0.1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法通过 Socket.IO 从 cookie 获取 Express 会话 ID 的相关文章

  • 是否可以实现异步跨域文件上传?

    有可能的 参见下文 首先我用这张图来解释一下异步文件上传可以实现 对不起 我已经关闭了我的一个域 该图像现在消失了 不过 这确实是一个很好的图像 这是在我发现 Stack Overflow 可以通过 Imgur 上传图像之前 正如您所看到的
  • 如何编写三元运算符(又名 if)表达式而不重复自己

    例如 这样的事情 var value someArray indexOf 3 1 someArray indexOf 3 0 有更好的写法吗 再说一遍 我并不是在寻求上述问题的答案 只是一个在三元运算符表达式中可能重复操作数的示例 就我个人
  • JavaScript 和数据库连接

    javascript可以直接访问数据库吗 我觉得我的问题是反问 因为这是一个安全问题 但这有可能吗 有可能的 有了新的html5功能 js可以通过WebSql连接 一个活生生的例子 http html5demos com database
  • 使用节点http代理转发http代理

    我正在使用 node http proxy 库来创建转发代理服务器 我最终计划使用一些中间件来动态修改 html 代码 这就是我的代理服务器代码的样子 var httpProxy require http proxy httpProxy c
  • 如何防止脚本注入攻击

    Intro 这个话题一直是 StackOverflow 以及许多其他技术论坛上许多问题和答案的祸根 然而 其中大多数都是特定于具体条件的 甚至更糟 通过脚本注入预防中的 整体 安全性dev tools console or dev tool
  • AngularJS:如何在 AngularJS 中使用或注入第三方库

    我是 Angular 和 Deployd 的新手 想知道如何一起使用它们 我发现 Deployd 网站中的示例很好 但它只消耗其余 API 数据 我想了解如何将 Deployd 作为 AngularJS 中的服务 例如 通过部署中可用的收集
  • 使用 ChartJS v2.0 自定义图例

    我正在尝试在 ChartJS v2 0 中创建自定义图例模板 在 ChartJS v1 中 我只是向新的 Chart 构造函数添加了一个属性 例如 legendTemplate ul li span style background col
  • 在 Three.js 中使用多种材质来合并几何体

    我想使用 2 个网格创建一棵松树 其中 1 个用于树干 另一个用于灌木 这就是我所做的 var pine geometry new THREE Geometry var pine texture 1 THREE ImageUtils loa
  • 如何使用 Material UI 制作一个圆形复选框?

    我尝试匹配的设计要求复选框为圆形 我正在使用 Material UI 和 React 边框半径不起作用 因为实际图标的边框不是可见复选框的边框 我不能只使用像 Font Awesome 这样的东西 因为它需要实际检查和取消检查 Curren
  • CasperJS - 在网站上注册并验证 Gmail 上发送的邮件 - 对于 slimer 和 phantom -

    Edit 这是windows的行为 linux就失败了 首先 如果您使用 casper 成功导航 gmail 没有随机等待时间 从 20 秒到 5 分钟 请告诉我 我想在我们的网站上注册 然后使用 Gmail 自动验证我的注册 整个注册步骤
  • 客户端上传并读取文件,角度为2

    我需要用户的日志文件 以便我可以读取和分析这些文件 例如某种放置区域 用户放置一个文件 然后我可以用javascript读取它 我使用 Angular2 rc5 我有 node js 在后台运行 但我不需要那里的数据 我只需要在客户端 是否
  • 检查消息是否是 DM。 (Discord.js 和 Discord.js-commando)

    如何在 Discord js 中检查消息是否为私信 我尝试了几种方法来测试这一点 我尝试过以下方法 if msg channel isDM Produced undefined if msg isDM Produced undefined
  • webpack 5 中是否可以让不同的入口包到不同的输出路径

    我正在使用 webpack 打包 google chrome 扩展 我想将文件夹结构保留在 dist 文件夹中 例如 我想将所有弹出资源打包在dist popup 这是我现在的配置 const path require path const
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • 在 JavaScript 中将整数数组转换为字符串数组

    我有一个如下所示的数组 var sphValues 1 2 3 4 5 然后我需要转换上面的数组 如下所示 var sphValues 1 2 3 4 5 我怎样才能转换 我用它来自动完成 您可以使用map https developer
  • Chrome 扩展允许的键盘快捷键

    当您创建 Chrome 浏览器扩展程序时 您可以通过实现来建议键盘快捷键chrome 命令 https developer chrome com extensions commandsAPI 是否有允许的组合键的记录列表 Chrome 似乎
  • 我们可以使用 axios 的 onDownloadProgress 来加载 API 吗?

    我需要使用 axios 创建一个用于在 React 项目中加载 API 的进度条 我为此发现了 onDownloadProgress 函数 但我不知道我们是否可以使用它来获取诸如加载百分比之类的信息 或者它是否仅用于文件下载 所以我不确定我
  • Socket.io 不断重复连接并忽略其他事件

    我正在尝试制作一个网络应用程序 用户可以在其中互相玩环形国际象棋 这是我的 app js 在服务器上 var express require express var app express var http require http Ser
  • 使用 JavaScript 在空闲时隐藏鼠标光标

    是否可以使用JavaScript来设置cursor属性的属性none如果鼠标在一定时间内处于非活动状态 例如五秒 请将其设置回auto当它再次活跃时 EDIT 我意识到none不是有效值cursor财产 尽管如此 许多网络浏览器似乎都支持它
  • jQuery fullCalendar + Fancybox 弹出窗口编辑事件

    我正在使用此代码在 fullCalendar 上生成事件

随机推荐

  • 在 R 中将 NA 设置为 0

    将一个数据帧与另一个数据帧合并后 偶尔会留下随机的 NA 我想将这些 NA 设置为 0 以便我可以用它们执行计算 我正在尝试这样做 bothbeams data within bothbeams data bothbeams data x
  • NSMutableArray 不添加对象[重复]

    这个问题在这里已经有答案了 我认为 我犯了一个非常基本的错误 但我正在使用NSMutableArray这不知何故并没有添加对象 我正在按其方式发送它 我有一个属性 并合成 property nonatomic strong NSMutabl
  • 如何惯用地复制切片?

    在 Go 中 复制切片是标准操作 如下所示 It will figure out the details to match slice sizes dst copy dst n src m 在 Rust 中 我找不到类似的替换方法 我想出的
  • 如何将 ActiveRecord 模型属性从 json 迁移到 jsonb?

    迁移应该是什么样子 我想利用 jsonb 数组查询技术 我会这样写迁移 def change reversible do dir dir up change column models attribute jsonb USING CAST
  • 持久订阅 ActiveMQ

    我正在尝试为我的消息设置持久订阅者 以便即使在服务器重新启动后它们也能保留在主题中 但在配置过程中我收到与 xml 相关的错误 这是我的配置 xml
  • sin 和 cos 很慢,有其他选择吗?

    我的游戏需要移动一定的角度 为此 我通过 sin 和 cos 获得角度向量 不幸的是 正弦和余弦是我的瓶颈 我确信我不需要这么精确 是否有替代 C sin cos 和查找表的方法 既相当精确 又非常快 我发现了这个 float Skelet
  • TypeScript getter setter 约定

    TypeScript 中类属性的约定 标准 是什么 在 Angular 2 演示 来自 Angular io 的英雄之旅 中 所有属性都设置为 public export class Hero id number name string 所
  • 允许按位运算的通用约束?

    我有一个enum public enum Flags COMMAND MSG 1 COMMAND FILE 2 COMMAND ACTION 4 现在 假设我设置了多个值 例如 Flags g Flags COMMAND ACTION Fl
  • 激活conda环境在vscode中停止工作

    我注意到conda激活环境没有明显原因就停止在 vscode 集成终端中工作 我当然没有安装任何新的扩展 也没有在过去几天更新 conda 或 vscode 预期行为 运行 conda activate 环境后 我希望激活环境并能够使用环境
  • Mercurial 子存​​储库 - 管理更复杂的依赖关系层次结构

    我有一个主项目 它使用相当标准的源代码树方法 Mercurial 子存 储库 Master lib compiled binaries things like log4net AutoFac etc source VS solution o
  • 自动将不同的 Excel 文件导入 MS Access 2010 表

    我想将所有 Excel 文件 具有不同的数据和列 从某个目录导入到 MS Access 2010 数据库中 为每个文件创建新表 我找到了将文件导入到一张表中的代码 Option Compare Database Option Explici
  • geany 自定义文件类型 .svrf 用于语法突出显示

    我有一个类似的问题 我复制并编辑了filetype extensions conf in my config geany adding CALIBRE rul svrf SVRF cal 然后下 config geany filedefs我
  • 如何调试意外静默终止的 win32 进程?

    我有一个用 C 编写的 Windows 应用程序 有时会消失 我使用 蒸发 这个词是因为没有留下任何东西 没有来自 Windows 的 我们很抱歉 消息 没有来自 Dr Watson 设施的故障转储 有一次崩溃发生在调试器下 调试器没有中断
  • React Native STUCK 启动打包器

    由于某种原因 当我想启动我的 React Native 项目时 它卡在 正在启动 Packager 部分 我尝试删除节点包 然后重新安装它们 通过yarn npm安装它们 但没有成功 我不知道该如何解决这个问题 太尴尬了 我遇到过同样的问题
  • 正确结束 Java 命令行应用程序

    我只是想知道 我需要打电话吗System exit 0 就在之前mainJava 命令行应用程序的方法结束了吗 如果是这样 为什么 如果我总是放在那里 与让它自行退出有什么区别0 什么没清理干净 提前致谢 不 您并不总是需要打电话Syste
  • 如何在张量流中将TextVectorization保存到磁盘?

    我已经训练了一个 TextVectorization 层 见下文 我想将其保存到磁盘 以便下次可以重新加载它 我努力了pickle and joblib dump 这是行不通的 from tensorflow keras layers ex
  • 如何在文本文件中逐行读取和替换字符串?

    我有一个文本文件 内容如下 INSERT INTO shops VALUES 3 1000000 0 INSERT INTO shops VALUES 3 1000010 0 INSERT INTO shops VALUES 3 10000
  • 对内核模块代码进行单元测试是否可行?

    如果是这样我应该使用什么技术 我正在考虑使用 hippomock 因为它们可以用来模拟 C 方法 还有更好的方法吗 如果是这样 任何人都可以提供建议 或者您认为内核的单元测试是否太过分了 从 Linux 内核版本 5 5 开始KUnit可用
  • 如何绕过mysql中无效的utf8字符串

    我有一个包含阿拉伯文本数据的大文本文件 当我尝试将其加载到 MySQL 表中时 出现错误消息Error code 1300 invalid utf8 character string 这是我到目前为止所尝试过的 LOAD DATA INFI
  • 无法通过 Socket.IO 从 cookie 获取 Express 会话 ID

    我在 Node 中有一个典型的 Web 应用程序 它利用 Express 框架和会话中间件 我还将 Socket io 用于应用程序的某些动态部分 目前 这是一种聊天机制 但这是无关的 我已经能够成功地自行设置会话和socket io 但希