在Zend重写会话ID的东西

时间:2011-06-25 19:15:45

标签: php jquery ajax session jquery-plugins

我试图使用jQuery.address插件来创建一些深层链接。但是一旦我启动.change()函数并启动了javascript,我的后端PHP应用程序就会将我注销。

我推断,这必须是因为我启动的每个ajax请求似乎都在重新生成session_id。

如果我尝试从preDispatch回显会话ID,则sessionId与启动请求的窗口相同。

如果我试图从postDispatch回复它,它已经改变为其他东西,当我刷新主窗口时,主窗口sessionId也发生了变化。

可以设置什么?

编辑26-06-2011 12:00

我发现代码似乎破坏了我的应用程序。

在我使用散列(#)重新加载页面之后,我使用$.address.change()函数中的函数来找出要加载的状态。由于我只使用我的应用程序中的3个面板中的一个,它只检查一个这样的参数:

urlVar=this.path();
resArray = urlVar.split('/');
urlVariable = resArray.shift();
if (typeof urlVariable != "undefined") {
   f.selectFromLeftPanel(urlVariable);
}

selectFromLeftPanel()就是这样:

if (typeof context == "object") {
            var itemId = $(context).attr('id');
            $("#" + itemId).addClass('loading');
            Frontpage.closePanes();
            $.address.value(itemId);
        } else if (typeof context == "string") {
            itemId = context;
        }

        switch (itemId) {
        case 'zebra_left_window_forms':
            c.log($(this));
            Frontpage.resetPane(Frontpage.firstPane);
            Frontpage.getPaneContent(Frontpage.startCategory,
                    Frontpage.firstPane, 'category', function() {

                        f.showPane(Frontpage.firstPane, itemId);

                    });
            f.setSelected(context, f.zeroPane);
            break;
             }

pane只是我用来隐藏/显示内容不同区域的列。 getPaneContent()函数是进行ajax调用的地方,如下所示:

$.get(Frontpage.BASEURL + data + "/rand/" + rand + "/value/"
                    + value + "/time/" + Math.random(), function(result) {
                Frontpage.resetPane(pane);
                var $newrow = $(into).find('div:first');
                // c.log($newrow);

                $($newrow).after(result);
                var retValue = $('#returnData', pane).html();
                c.log(retValue);
                $('#returnData', pane).remove();
                $('#zebra_content_pane_back_button').attr('href', retValue);
                $('#zebra_content_pane_back_button').attr('rel', retValue);
                Frontpage.hideBackButton();
                if (callbackFn) {
                    if (typeof callbackFn == 'function') {
                        callbackFn.call(this);

                    }

                }
                delete result;
            });

好的,现在更详细地讨论问题本身:

发生的事情是,在发出ajax请求时,会话数据以某种方式丢失。由于app用户必须登录系统才能执行任何操作,因此在调用getPaneContent()函数后会显示登录屏幕,因此在进行了ajax调用之后。我用我的页面的一部分测试了这个,我没有要求会话,我看到会话是空的。由于我没有清除数据,并且会话的超时尚未发生,因此必须在执行Ajax请求时以某种方式更改会话ID,因此新会话ID没有任何关联的数据用它。

现在,问题 - 如果我不使用jQuery.address插件,则不会发生注销。 ajax工作正常,但每个ajax响应都有一个Set-Cookie标头集,它会更改主屏幕会话ID。我确实认为,这可能会以某种方式涉及到这个问题。 如何避免退出?

此外,如果我从f.selectFromLeftPanel()函数调用$.address.change(),则只会发生注销。如果我省略此调用,ajax工作,会话ID仍会更改,但不会注销。

1 个答案:

答案 0 :(得分:4)

看来,我找到了解决方案。

在ajax请求期间,我正在调用一个扩展Zend_Auth的类,我用它来确定用户。好吧,在这个扩展类的init()函数中,我正在调用Zend_Session::rememberMe(60 * 60 * 24 * 7),因为我认为这样做会延长我的会话的生命周期,而实际上,它会生成一个新的会话,接受这个新的生命。

虽然我已经解决了这个问题,但它让我想知道,为什么它之前没有失败,为什么它现在开始失败。