我有一个 symfony 1.4 应用程序,我刚刚将其更改为将 session 数据保存在 mysql 数据库的 session 表中。
下面是序列化 mysql 表 session_data 字段的示例。
symfony/user/sfUser/lastRequest|i:1447469750;
symfony/user/sfUser/authenticated|b:1;
symfony/user/sfUser/credentials|a:0:{}
symfony/user/sfUser/attributes|a:2:
{s:30:"symfony/user/sfUser/attributes";
a:3:{s:12:"current_page";
s:6:"splash";s:15:"logged_in_token";
s:31:"e9psz6e3iko4scsk0c4k4wckwk4k0k4";
s:25:"available_credits_session";
i:0;}s:19:"sfGuardSecurityUser";
a:1:{s:7:"user_id";s:1:"1";}}
symfony/user/sfUser/culture|s:2:"en";
我想从这个序列化数据中提取两条信息。
1)我正在使用的logging_in_token ID,因此用户的真实用户ID不会暴露。
和
2) user_id,即实际用户 ID。
我需要此信息的原因是应用程序要求一次只能有一个事件 session 。
因此,如果 session 表中有两个相同的用户 ID,我将使用此信息注销或使上一个 session 超时。
这似乎是序列化数据的特定“symfony 方式”。
任何有关如何在 Node 或 JavaScript 中提取此信息的想法将不胜感激
最佳答案
此数据的序列化方式并非特定于 symfony
,而是特定于 php
。根据 php.ini
中的 session.serialize_handler
设置,php 以不同的方式序列化 session 数据。该设置的默认值只是 php ,它似乎在您的情况下使用。
我在 php
中使用以下方法来转义此编码 - 它输出带有数据的常规数组。这里没有任何 php
特定内容,因此您可以轻松地将其移植到 javascript:
(但是最好的解决方案是在将此数据保存到数据库之前执行“转义”,然后您不需要在 JavaScript 端执行此操作)
function unserializePhp($sessionData)
{
$returnData = array();
$offset = 0;
while ($offset < strlen($sessionData)) {
if (!strstr(substr($sessionData, $offset), '|')) {
throw new Exception('invalid data, remaining: ' . substr($sessionData, $offset));
}
$pos = strpos($sessionData, '|', $offset);
$num = $pos - $offset;
$varname = substr($sessionData, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($sessionData, $offset));
$returnData[$varname] = $data;
$offset += strlen(serialize($data));
}
return $returnData;
}
关于javascript - 提取序列化的用户 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33706486/