【问题标题】:node.js / socket.io, cookies only working locallynode.js / socket.io,cookies 只在本地工作
【发布时间】:2012-04-26 18:08:30
【问题描述】:

我正在尝试使用基于 cookie 的会话,但是它只能在本地机器上工作,而不是通过网络工作。如果我删除与会话相关的内容,它会在网络上正常工作...

您必须原谅这里缺乏高质量的代码,我刚开始使用节点/套接字等,找到任何明确的指南都很难,所以我现在处于 n00b 领域。基本上,到目前为止,这是从各种 sn-ps 一起破解的,大约 10% 了解我实际上在做什么......

我在 Chrome 中看到的错误是:

socket.io.js:1632GET http://192.168.0.6:8080/socket.io/1/?t=1334431940273500(内部服务器错误)

Socket.handshake ------- socket.io.js:1632

Socket.connect ------- socket.io.js:1671

Socket ------- socket.io.js:1530

io.connect ------- socket.io.js:91

(匿名函数)------- /socket-test/:9

jQuery.extend.ready ------- jquery.js:438

在我看到的服务器控制台中:

调试 - 提供静态内容 /socket.io.js

调试 - 授权

警告 - 握手错误没有 cookie

我的服务器是:

var express = require('express')
  , app = express.createServer()
  , io = require('socket.io').listen(app)
  , connect = require('express/node_modules/connect')
  , parseCookie = connect.utils.parseCookie
  , RedisStore = require('connect-redis')(express)
  , sessionStore = new RedisStore();

app.listen(8080, '192.168.0.6');

app.configure(function()
{
    app.use(express.cookieParser());

    app.use(express.session(
    {
        secret: 'YOURSOOPERSEKRITKEY',
        store: sessionStore
    }));
});

io.configure(function()
{
    io.set('authorization', function(data, callback)
    {
        if(data.headers.cookie)
        {
            var cookie = parseCookie(data.headers.cookie);

            sessionStore.get(cookie['connect.sid'], function(err, session)
            {
                if(err || !session)
                {
                    callback('Error', false);
                }
                else
                {
                    data.session = session;
                    callback(null, true);
                }
            });
        }
        else
        {
            callback('No cookie', false);
        }
    });
});

var users_count = 0;

io.sockets.on('connection', function (socket)
{
    console.log('New Connection');

    var session = socket.handshake.session;

    ++users_count;

    io.sockets.emit('users_count', users_count);

    socket.on('something', function(data)
    {
        io.sockets.emit('doing_something', data['data']);
    });


    socket.on('disconnect', function()
    {
        --users_count;

        io.sockets.emit('users_count', users_count);
    });

});

我的页面JS是:

jQuery(function($){

    var socket = io.connect('http://192.168.0.6', { port: 8080 } );

    socket.on('users_count', function(data)
    {
        $('#client_count').text(data);
    });

    socket.on('doing_something', function(data)
    {
        if(data == '')
        {
            window.setTimeout(function()
            {
                $('#target').text(data);
            }, 3000);
        }
        else
        {
            $('#target').text(data);
        }
    });

    $('#textbox').keydown(function()
    {
        socket.emit('something', { data: 'typing' });
    });

    $('#textbox').keyup(function()
    {
        socket.emit('something', { data: '' });
    });

});

【问题讨论】:

  • 我遇到了同样的问题,但是,只有在使用 Chrome 时。我的应用程序在 Safari 中运行良好。你有同样的情况吗?我不确定解决方案是什么。

标签: javascript node.js redis express socket.io


【解决方案1】:

检查您的系统时钟,如果服务器和客户端的时钟不同,cookie 可能会在您设置后立即过期。

【讨论】:

  • 检查了时钟,它们看起来不错 - 饼干通常也可以与其他东西一起使用
  • 好吧,似乎 data.headers.cookie 不存在。您可以转储请求标头以查看发生了什么吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2021-07-28
  • 2020-12-15
相关资源
最近更新 更多