如何检查用户是否已连接并获取其会话id(由PHP启动的会话)
**我已经看到了一些关于这个问题的帖子,或者是这个问题的风格,但是他们是很久以前被问到的,我想得到一个更新的答案,这可能也会帮助其他人 我一直在使用PHP开发一个简单的网站(用于学习),带有注册和登录系统。现在有一些页面只有登录用户才能访问。 在PHP中,我只需启动一个会话,在用户登录时为其提供唯一的会话id,如果该页面只供登录用户查看,我只需检查会话是否已设置,并获取会话内容,该内容将用于从数据库中获取用户详细信息(姓名、生日等) 现在我想添加实时聊天功能,使用socket.io和Node.js。 因此,我需要只允许登录用户访问,并获取他们的会话id,以便我可以从数据库中获取他们的名称以显示。 这是到目前为止的基本工作聊天,适用于登陆如何检查用户是否已连接并获取其会话id(由PHP启动的会话),php,node.js,Php,Node.js,**我已经看到了一些关于这个问题的帖子,或者是这个问题的风格,但是他们是很久以前被问到的,我想得到一个更新的答案,这可能也会帮助其他人 我一直在使用PHP开发一个简单的网站(用于学习),带有注册和登录系统。现在有一些页面只有登录用户才能访问。 在PHP中,我只需启动一个会话,在用户登录时为其提供唯一的会话id,如果该页面只供登录用户查看,我只需检查会话是否已设置,并获取会话内容,该内容将用于从数据库中获取用户详细信息(姓名、生日等) 现在我想添加实时聊天功能,使用socket.io和Node.j
localhost:3000
:(包含两个文件:index.html
,和index.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');
});
<!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>
index.html:
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');
});
<!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>
$(函数(){
var socket=io();
$('form')。提交(函数(){
emit('chat message',$('#m').val());
$('m').val('');
返回false;
});
socket.on('chat message',函数(msg){
$(“#消息”).append($(“”).text(msg));
});
});
Socket.IO聊天
*{边距:0;填充:0;框大小:边框框;}
正文{字体:13px Helvetica,Arial;}
表单{background:#000;填充:3px;位置:固定;底部:0;宽度:100%;}
表单输入{边框:0;填充:10px;宽度:90%;右边距:5%;}
窗体按钮{宽度:9%;背景:rgb(130224255);边框:无;填充:10px;}
#消息{列表样式类型:无;边距:0;填充:0;}
#消息li{padding:5px 10px;}
#留言李:第n个孩子(奇数){背景:#eee;}
发送
我需要做什么
谢谢您可以将用户名与聊天信息一起发送。 例如,您的聊天信息包含“Hello world”,并且是用户“John Doe”发送的。 然后您可以发送这样的对象,而不仅仅是消息:
{ "name": "John Doe", "message": "Hello World" }
到您的聊天应用程序
在另一端,您解码这个JSON对象,并简单地显示名称和消息
在您的情况下,这意味着更换以下部件:
socket.emit('chat message', $('#m').val());
与
及
$(“#消息”).append($(“”).text(msg));
与
$(“#消息”).append($(“”).text(msg.name+”:“+msg.message));
什么是“登录用户”?为什么不检查该条件并包装调用以在该条件下初始化聊天?这意味着会话已从数据库中获取唯一的会话启动,当他们提供用户名和密码时:session_start()$_会话['username']=$username;但是我想保存聊天记录,所以我需要JS代码中的会话详细信息,以便将消息添加到MySQL数据库,不是吗?谢谢,顺便说一句,我编辑了这篇文章(在**编辑下)。编辑有关如何仅对登录用户启用聊天功能的信息。这是否意味着我可以简单地将PHP条件“if(!isset($\u SESSION['username'])”放在聊天文件(index.html)上方?这会起作用,尽管它并不完全安全。任何了解您的NodeJS服务器的人仍然可以从您的聊天室发送和接收消息。关于编辑:您可以在Javascript中保存消息,这样就不需要PHP了。LocalStorage似乎是实现这一点的正确API:我明白了,那么为了验证用户是否通过节点登录,您的方法是什么?所以即使有人知道服务器,也不能聊天,除非他是那个特定的用户?我需要将会话传递到index.js进行验证,对吗?或者还有一种更复杂的方法,在客户端(Javascript)端需要某种令牌,您可以将用户与之关联。与你所做的相比可能有点复杂。这也是你不能简单地在这样的编辑中解释的东西,这个帖子似乎解释了它:@pileup不一定,看看jwt
$('#messages').append($('<li>').text(msg.name + ": " + msg.message));