无法从带有 Socket.IO 的 Cookie 获取快速会话 ID
Can't get Express session ID from cookies w/ Socket.IO
我在Node中有一个典型的Web应用程序,它利用了Express框架和会话中间件。我还将 Socket.io 用于应用程序的某些动态部分(目前,这是一种聊天机制,但这是切线的(。我已经能够成功地自行设置会话和 socket.io,但希望将它们结合起来(例如:在不访问数据库的情况下将套接字聊天消息与用户帐户相关联(。
应该注意的是(我可以看到这是一个可能的问题点(,我在不同的端口上运行两个快速服务器:一个用于常规 HTTP 流量,另一个用于 HTTPS 流量。但是,我让两台服务器都进行了标识配置并共享相同的会话存储。会话确实在 http 和 https 页面之间为我持久存在。会话最初是通过HTTPS提供的页面设置的,socket.io 页面是普通HTTP。
我正在按照此处的指南来实现我正在寻找的有关集成 socket.io 和会话的内容。但是,在授权函数中,data.headers.cookie 从未设置,尽管我的应用程序的基于会话的部分按预期工作。更奇怪的是,在设置会话后,如果我从浏览器中执行console.log(document.cookie)
,我会得到一个空字符串,但是当我使用 Firefox 开发人员工具栏查看我的 cookie 时,有一个用于表达和连接的 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>
更新
即使在使用 SocketIO 的页面的路由中手动设置 cookie(而不仅仅是会话变量(后,请求的 cookie 部分仍然不存在。
在被告知查看客户端的初始化之前,我永远不会想到这一点。我将地址从本地主机更改为显式 IP (127.0.0.1(,现在 cookie 与 Socket.IO 中的标头一起发送。我不确定这是否明显,因为我假设本地主机无论如何都被映射到 127.0.0.1。
- 如何从浏览器中获取cookie,从另一个应用程序中删除
- 分析JS代码以在客户端获取cookie
- Js_of_ocaml-获取cookie时出错
- 获取cookie's的单值javascript
- 如何使用socket.io获取cookie数据
- 无法在 Express.js 中设置和获取 Cookie
- JQuery-从响应中获取Cookie
- 在WordPress中创建并获取cookie
- 使用PHP和JSP在另一个网页中获取cookie值
- 加载页面以获取cookie并同时读取源代码
- JavaScript 设置并获取 cookie
- 在Sencha touch 2.0中使用Ajax请求获取cookie
- JQuery.post 从服务器获取cookie,但不在我的计算机上设置它们
- 如何在 Meteor 中设置和获取 cookie(服务器端)
- 如何使用 Greasemonkey 从远程域获取 cookie
- 获取cookie值的问题
- 访问HTTPS页面上的HTTP以获取Cookie
- 从其他网络应用程序获取Cookie
- 如何使用URL获取cookie值
- 如何从用户输入中获取cookie,并将其显示在html元素上