【问题标题】:How to check if user is connected and get his session id (Session started by PHP)如何检查用户是否已连接并获取他的会话 ID(由 PHP 启动的会话)
【发布时间】:2018-10-12 17:27:25
【问题描述】:

**我看过一些关于这个问题的帖子,或者这个问题的风格,但是很久以前就有人问过他们,我想得到一个更新的答案,这也可能对其他人有所帮助

我一直在使用 PHP 开发一个简单的网站(用于学习),带有注册和登录系统。现在有些页面只有登录用户才能访问。 在 PHP 中,我只需启动一个会话,在用户登录时为其提供唯一的 session_id,如果该页面仅供登录用户查看,我只需检查会话是否已设置,并获取会话内容, 这将用于从数据库中获取用户详细信息(姓名、生日等)

现在我想添加实时聊天功能,使用带有 Node.js 的 socket.io。 所以我需要只允许登录用户访问,并获取他们的会话 id,以便我可以从数据库中获取他们的名字来显示。 这是迄今为止的基本工作聊天,适用于登陆localhost:3000的任何人:(包含2个文件:index.htmlindex.js

编辑:

这是我在 PHP 中用来登录用户的:

session_start();
$_SESSION['username'] = $username;

并检查他们是否已登录:

if (!isset($_SESSION['username'])) { //do stuff

我希望保存聊天内容(如 Facebook 或 WhatsApp 聊天),所以我需要 nodeJS 可以访问会话以将聊天内容插入数据库,并从数据库中获取以前的内容,不?或者我只能通过 PHP 做到这一点?

----结束编辑----

index.js:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log('a user connected');
    socket.on('chat message', function(msg){
    io.emit('chat message', msg);
    });
  socket.on('disconnect', function(){
    console.log('user disconnected');   
  });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});

index.html:

<!doctype html>
<html>
  <head>    
    <script src="socket.io/socket.io.js"></script>
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
    <script>
    $(function () {
        var socket = io();
        $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
    });
    socket.on('chat message', function(msg){
        $('#messages').append($('<li>').text(msg));
    });
  });
</script>
    
    <title>Socket.IO chat</title>
    <style>
      * { margin: 0; padding: 0; box-sizing: border-box; }
      body { font: 13px Helvetica, Arial; }
      form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
      form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
      form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages li { padding: 5px 10px; }
      #messages li:nth-child(odd) { background: #eee; }
    </style>
    
  </head>
  <body>

    <ul id="messages"></ul>
    <form action="">
      <input id="m" autocomplete="off" /><button>Send</button>
    </form>
  </body>
</html>

我需要做什么?

谢谢

【问题讨论】:

  • “登录用户”是什么意思?为什么不检查该条件并包装调用以在该条件下初始化聊天?
  • 这意味着当他们提供用户名和密码时,会话已经从数据库中获取的唯一会话开始: session_start(); $_SESSION['用户名'] = $用户名;但是我想保存聊天,所以我需要JS代码中的会话详细信息,才能将消息添加到MySQL数据库,不是吗?

标签: php node.js


【解决方案1】:

您可以将用户名与聊天消息一起发送。 例如,您的聊天消息包含“Hello world”,而用户“John Doe”发送了它。 然后您可以发送这样的对象,而不仅仅是消息:

{ "name": "John Doe", "message": "Hello World" }

到您的聊天应用程序。

在另一端解码这个 JSON 对象,并简单地显示名称和消息。

在您的情况下,这意味着替换以下内容:

socket.emit('chat message', $('#m').val());

socket.emit('chat message', {name: "John Doe", message: $('#m').val()});

还有

$('#messages').append($('<li>').text(msg));

$('#messages').append($('<li>').text(msg.name + ": " + msg.message));

【讨论】:

  • 谢谢,顺便说一句,我编辑了帖子(在 **edit 下)。编辑关于如何启用聊天仅登录用户。这是否意味着我可以简单地将 PHP 条件 "if (!isset($_SESSION['username']))" 留在聊天文件 (index.html) 上方?
  • 这可行,尽管它并不完全安全。任何了解您的 NodeJS 服务器的人仍然可以从您的聊天中发送和接收消息。关于您的编辑:您可以在 Javascript 中保存消息,这样您就不需要 PHP。 LocalStorage 似乎是正确的 API:developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
  • 我明白了,那么您的方法是什么,以验证用户是否通过节点登录?这样即使有人知道服务器也无法聊天,除非他是那个特定的用户?我将需要以某种方式将会话传递给 index.js 进行验证,对吗?或者有不同的方法
  • 这仍然更复杂,您需要在客户端(Javascript)端使用某种令牌,您可以将其与用户相关联。与您所做的相比,它可能有点复杂。这也是你不能简单地在这样的编辑中解释的东西,这个线程似乎可以解释它:stackoverflow.com/questions/29121112/…
  • @pileup 不一定,看看jwt
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 2013-10-29
  • 2016-12-04
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多