codeigniter nodejs 和 nowjs 集成

Posted

技术标签:

【中文标题】codeigniter nodejs 和 nowjs 集成【英文标题】:codeigniter nodejs and nowjs integration 【发布时间】:2012-01-11 23:21:22 【问题描述】:

我正在尝试将 nodejs 和 nowjs 与 codeigniter 框架集成,因为我没有时间重写整个站点,所以我想检查用户是否已登录。我正在使用 ion_auth 并将会话存储在 db 中。

客户端js:

var session_id = $.cookie('sc_session');

$("form").submit(function() 
    now.distributeMessage($("textarea").val(),session_id);
);

now.receiveMessage = function(message)
    $("body").append("<br>" + message);
;

这是 nodejs 服务器代码:

编辑:*稍微简化一下,从客户端js获取会话cookie*

everyone.now.distributeMessage = function(message,session_cookie) 
    exec('php index.php user_session decrypt ' + encodeURIComponent(session_cookie),
    function (error, stdout, stderr) 
        var parts = stdout.split(';');
        var session_id = parts[1].split(':')[2];
        var query = 'select * from sc_sessions where session_id=' + session_id;
        client.query(query, function (err, results, fields) 
            if (results) 
                everyone.now.receiveMessage(str);
            
        );
    );
;

这里是nodejs调用的控制器:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class User_session extends CI_Controller

  public function __construct()
  
    parent::__construct();
    if (!$this->input->is_cli_request()) 
        redirect('index');
    
  

  public function decrypt($session_id)
  
    $this->load->library('encrypt');
    $session_id = urldecode($session_id);
    echo $this->encrypt->decode($session_id);
  

它正在工作,我可以将 user_data 从数据库中的会话记录到控制台,并且它正确调用了everyone.now.receiveMessage 函数。

对此我有三个问题:

1) 在 sc_sessions db 表中插入了一些行,其 session_id 为空,但 user_data、user_agent 和 ip 为 0.0.0.0。每次提交表单时一行。

这是什么原因造成的,我该如何解决?

我知道 ajaxcall 和 codeigniter 会话存在问题。看到这个帖子:

有没有办法查看请求是否是通过 websockets 发出的?

2) 检查用户是否登录的最佳方法是什么?例如 if 语句,您检查查询是否返回任何内容或是否有更好的方法?

3) 有更好的方法吗?

感谢任何帮助,因为我被困在这个问题上。

乔治

编辑: 从命令行调用脚本会导致它创建一个新会话。通过扩展会话类来防止它。

应用程序/库/MY_Session.php

<?php
class MY_Session extends CI_Session 

    public function __construct()
    
        $CI = get_instance();

        if ($CI->input->is_cli_request())
        
             return;
        

        parent::__construct();
      

【问题讨论】:

在 CI 论坛上询问可能是一个更好的主意。在那里获得更好答案的机会要高十倍。 好的!我会试试谢谢 @Steven,无需将 George BACK 引导至 CI 论坛,对于 CI / PHP / 等问题非常有用! 【参考方案1】:

很好的问题,但测试答案的开销很大。

我最好的猜测是 CLI 不会传递 user_agent 和 ip 等环境变量。这些由 apache 处理,与 CLI 请求本身无关。如果你知道它在节点环境中是安全的,我会单独使用 session_id。

【讨论】:

感谢您的回复。我用更少的代码更新了这个问题。它仍然在会话表中插入一行。解决不了这个问题!!否则它会正常工作。 您的控制器是否仍为 CLI 请求加载会话类?我认为您必须对自动加载有所了解,因为 CI 可能不会自动禁用它... 当控制器从 CLI 运行时,有什么方法可以让 ci 不创建会话 cookie?也许通过扩展会话类。问题是它在哪里设置? 它通过扩展 Session 类来工作,就像在这个答案中一样:***.com/questions/8394225/…

以上是关于codeigniter nodejs 和 nowjs 集成的主要内容,如果未能解决你的问题,请参考以下文章

Nowjs:[RangeError:超出最大调用堆栈大小]

Codeigniter在nodejs中读取会话cookie

如何将backbone.js 与websockets/socket-io/nowjs 一起使用

用于生产的 Nodejs 网络服务器

在 now.js/socket.io 聊天中增强安全性

nodejs / express中的数据库会话支持[关闭]