提取序列化的用户会话数据
extract serialized user session data
我有一个 symfony 1.4 应用程序,我刚刚将其更改为在 mysql 数据库中的会话 table 中保存会话数据。
这里是序列化的 mysql table 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) 我正在使用的 logged_in_token id 所以用户的真实用户 id 不会暴露。
和
2) user_id 这是实际的用户 ID。
我需要此信息的原因是应用程序要求他们一次只能有一个活动会话。
因此,如果会话中有两个相同的用户 ID table,我将使用此信息注销或暂停上一个会话。
似乎是序列化数据的特定"symfony way"。
任何关于如何在节点或 javascript 中提取此信息的想法将不胜感激
此数据的序列化方式并非特定于 symfony
,而是特定于 php
。根据 php.ini
中的 session.serialize_handler
设置,php 以不同的方式序列化会话数据。该设置的默认值只是 php
,您的情况似乎使用了它。
我在 php
中使用以下方法来转义此编码 - 它输出带有数据的常规数组。这里没有 php
特定内容,因此您可以轻松地将其移植到 javascript:
(但是最好的解决方案是在将此数据保存到数据库之前执行 "unescaping",然后您不需要在 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;
}
我有一个 symfony 1.4 应用程序,我刚刚将其更改为在 mysql 数据库中的会话 table 中保存会话数据。
这里是序列化的 mysql table 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) 我正在使用的 logged_in_token id 所以用户的真实用户 id 不会暴露。
和
2) user_id 这是实际的用户 ID。
我需要此信息的原因是应用程序要求他们一次只能有一个活动会话。
因此,如果会话中有两个相同的用户 ID table,我将使用此信息注销或暂停上一个会话。
似乎是序列化数据的特定"symfony way"。
任何关于如何在节点或 javascript 中提取此信息的想法将不胜感激
此数据的序列化方式并非特定于 symfony
,而是特定于 php
。根据 php.ini
中的 session.serialize_handler
设置,php 以不同的方式序列化会话数据。该设置的默认值只是 php
,您的情况似乎使用了它。
我在 php
中使用以下方法来转义此编码 - 它输出带有数据的常规数组。这里没有 php
特定内容,因此您可以轻松地将其移植到 javascript:
(但是最好的解决方案是在将此数据保存到数据库之前执行 "unescaping",然后您不需要在 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;
}