将会话存储为JSON的PHP会话处理程序未正确解码PHP序列化
我已经使用DynamoDB实现了一个会话处理程序。它工作正常,除了从服务器返回响应并调用将会话存储为JSON的PHP会话处理程序未正确解码PHP序列化,php,json,session,serialization,amazon-dynamodb,Php,Json,Session,Serialization,Amazon Dynamodb,我已经使用DynamoDB实现了一个会话处理程序。它工作正常,除了从服务器返回响应并调用json\u decode时,嵌套的php序列化会话字符串被破坏。我假设在JSON对象中存储序列化会话是不兼容的?这是一个逃避问题吗 问题: 有没有办法绕过这个问题 可以用JSON而不是我假设使用的phpserialize()来序列化会话吗?这可能会解决问题 这是原作在DB中的外观(注意:它很长,所以我自己剪掉了末端) 这是在调用此字符串所在的json对象上的json\u decode后的结果: _sf2_a
json\u decode
时,嵌套的php序列化会话字符串被破坏。我假设在JSON对象中存储序列化会话是不兼容的?这是一个逃避问题吗
问题:
serialize()
来序列化会话吗?这可能会解决问题json\u decode
后的结果:
_sf2_attributes|a:4:{s:34:"_security.secured_area.target_path";s:36:"http://my.domain";s:10:"some_id";s:13:"abc123";s:8:"userData";O:27:"Some\Symfony\Bundle":49:{s:8:"
它似乎在原来的星号处被截断。json和序列化在PHP中工作良好
class ClassA
{
public $publicMember;
private $privateMember;
protected $protected;
}
$object = new ClassA();
var_dump(unserialize(json_decode(json_encode(serialize($object)))));
但这一问题可能来自中国。它似乎关闭了,但是。。。您可以在json_编码之前添加额外的包装
var_dump(unserialize(base64_decode(json_decode(json_encode(base64_encode(serialize($object)))))));
如果它是序列化的,您应该使用
unserialize()
来解码它,而不是json\u decode()
。请显示您的代码。php会话将自动序列化为php使用的任何格式。然后我将其存储在使用JSON的DynamoDB中,因此我有一个包含php会话的JSON对象。当我调用json_decode时,它将所有内容都作为一个数组提供,但会话字符串被截断。使用base64编码有效。我将进一步研究为什么没有base64它会失败。这个错误是针对用于PHP的AWS SDK版本1的,因为它使用SimpleXML处理所有事情。版本2没有。但是,空字节显然是问题发生的地方。您在哪里应用base64编码?@jeremy-我尝试了将会话数据传递给写入方法的编码:$this->sessionHandler->write($sessionId,base64_encode($data))
然后在read方法中对其进行解码。这似乎解决了问题,但感觉有点不对劲。我很乐意帮你找出确切的原因。如果你想在论坛上讨论,我已经在论坛上打开了一个帖子:酷。我将对此进行更深入的研究,但可能要到下周晚些时候。
var_dump(unserialize(base64_decode(json_decode(json_encode(base64_encode(serialize($object)))))));