Php 重写会话ID';他在泽德

Php 重写会话ID';他在泽德,php,jquery,ajax,session,jquery-plugins,Php,Jquery,Ajax,Session,Jquery Plugins,我试图使用jQuery.address插件来创建一些深度链接。但当我启动.change()函数并启动javascript时,我的后端PHP应用程序就会将我注销 我推断,这一定是因为我启动的每个ajax请求似乎都在重新生成会话id 如果我尝试从preDispatch回显会话id,则sessionId与启动请求的窗口中的会话id相同 如果我尝试从postDispatch回显它,它已经更改为其他内容,并且当我刷新主窗口时,主窗口会话ID也已更改 是什么造成的 编辑2011年6月26日12:00 我发现

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

我推断,这一定是因为我启动的每个ajax请求似乎都在重新生成会话id

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

如果我尝试从
postDispatch
回显它,它已经更改为其他内容,并且当我刷新主窗口时,主窗口会话ID也已更改

是什么造成的

编辑2011年6月26日12:00

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

在使用散列(
#
)重新加载页面后,我使用
$.address.change()函数中的函数来确定要加载的状态。由于我只使用了我应用程序中的3个面板中的一个,它只检查一个参数,如下所示:

urlVar=this.path();
resArray = urlVar.split('/');
urlVariable = resArray.shift();
if (typeof urlVariable != "undefined") {
   f.selectFromLeftPanel(urlVariable);
}
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;
             }
$.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;
            });
selectFromLeftPanel()
中,如下所示:

urlVar=this.path();
resArray = urlVar.split('/');
urlVariable = resArray.shift();
if (typeof urlVariable != "undefined") {
   f.selectFromLeftPanel(urlVariable);
}
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;
             }
$.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;
            });
窗格
只是我用来隐藏/显示包含内容的不同区域的列。
getPaneContent()
函数是进行ajax调用的地方,如下所示:

urlVar=this.path();
resArray = urlVar.split('/');
urlVariable = resArray.shift();
if (typeof urlVariable != "undefined") {
   f.selectFromLeftPanel(urlVariable);
}
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;
             }
$.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请求时,会话数据不知何故丢失了。由于应用程序用户必须登录到系统才能执行任何操作,因此在调用
getPaneContent()
函数之后,即在进行ajax调用之后,会显示登录屏幕。我用我的页面的一部分测试了这个,我没有要求会话,我看到会话是空的。由于我没有清除数据,并且会话的超时还没有发生,因此在执行Ajax请求时,会话id必须以某种方式更改,因此新的会话id没有任何与之相关的数据

现在,问题是——如果我不使用jQuery.address插件,就不会发生注销。ajax工作得很好,但是每个ajax响应都有一个
Set Cookie
头集,它会更改主屏幕会话ID。我确实认为,这可能与问题有关如何避免注销?


另外,只有在我从
$.address.change()
函数调用
f.selectFromLeftPanel()
时,才会发生注销。如果我调用这个调用,ajax会工作,会话ID仍然会更改,但不会注销。

看来,我已经找到了解决方案

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

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