如何使用symfony2正确地重新打开会话?

时间:2011-11-13 14:17:30

标签: flash session symfony

我在我的symfony2应用程序中使用了一个flash组件,它上传了多个图像,当它们到达服务器时,我想重新打开会话,这样我就可以将图像存储在相对于登录用户的位置。我发送每个文件上传的PHP会话ID ...

在vanilla PHP中,我可以按照......的方式实现这一目标。

session_id($originalSessionId);
session_start();

但使用安全上下文是否有symfony2方法?

编辑:This is a similar question,虽然我想通过传递令牌并使用单独的防火墙保护上传URL来创建某种基于令牌的登录。

4 个答案:

答案 0 :(得分:6)

首先,您需要创建自己的会话存储类,如下所示:

<?php
namespace Elao\BackBundle\Session;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage;

class Storage extends NativeSessionStorage
{
    public function __construct(array $options = array(), ContainerInterface $container)
    {
        $request = $container->get('request');
        if ($request->query->has('sessionId')) {
            $request->cookies->set(session_name(), 1);    // We have to simulate this cookie, in order to bypass the "hasPreviousSession" security check
            session_id($request->query->get('sessionId'));
        }
        return parent::__construct($options);
    }
}

然后,您必须重新定义默认值(例如,在config.yml中):

parameters:
    session.storage.native.class: ElaoBackBundleSessionStorage
services:
    session.storage.native:
        class:     %session.storage.native.class%
        arguments: [%session.storage.options%, @service_container]

答案 1 :(得分:3)

当使用SWFUpload允许多文件上传时,我遇到了同样的问题。我做的是修改app [_dev] .php:

if (array_key_exists(ini_get('session.name'), $_GET)) {
    $_COOKIE[ini_get('session.name')] = $_GET[ini_get('session.name')];
}

在视图中,我将上传网址设置为

{{ path('...') }}?{{ session.name }}={{ session.value }}

在调用此视图的控制器中,

return $this->render('...html.twig', array(
    'session' => array(
        'name' => ini_get('session.name'),
        'value' => session_id(),
    ),
));

希望这有帮助!

答案 2 :(得分:1)

您可能知道Symfony将所有请求路由到app或app_dev.php。我会将上传页面的重写规则添加到新的php文件中,如果会话ID在$ _GET变量中,则将其设置为$ _COOKIE,然后包括app.php或app_dev.php。

您也可以保存文件,成功时用户会向服务器发送ajax调用,而不是将这些文件与用户关联。

如果你找到一个不那么黑客的解决方案,请告诉我。

答案 3 :(得分:-1)

你为什么要这个?当用户上传图像时以及当他被重定向到页面时,会话ID应该相同,然后处理它们。 Symfony通常会自动启动您的会话。