我试图使用jQuery.address
插件来创建一些深度链接。但一旦我启动.change()
函数并启动javascript,我的后端PHP应用程序就会将我注销。
我推断,这一定是因为我启动的每个ajax请求似乎都在重新生成session_id。
如果我尝试从preDispatch
回显会话id,那么sessionId与启动请求的窗口中的会话id相同。
如果我尝试从postDispatch
回显它,它已经更改为其他内容,并且当我刷新主窗口时,主窗口sessionId也发生了更改。
是什么设置的?
编辑2011年6月26日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请求时,会话数据会以某种方式丢失。由于应用程序用户必须登录到系统才能执行任何操作,因此在调用getPaneContent()
函数之后,也就是在进行ajax调用之后,会显示登录屏幕。我在我的页面上测试了这一点,我制作了一个不要求会话的部分,我发现会话是空的。由于我没有清除数据,而且会话的超时还没有发生,所以在执行Ajax请求时,会话id肯定发生了某种变化,因此新的会话id没有任何相关数据。
现在,问题是,如果我不使用jQuery.address插件,就不会发生注销。ajax工作得很好,但每个ajax响应都有一个Set-Cookie
标头集,它会更改主屏幕会话ID。我确实认为,这可能在某种程度上涉及到问题如何避免注销
此外,只有当我从$.address.change()
函数调用f.selectFromLeftPanel()
时,才会发生注销。如果我提交了这个调用,ajax就会工作,会话ID仍然会更改,但不会注销。
我似乎已经找到了解决方案。
在ajax请求期间,我调用了一个扩展Zend_Auth
的类,我用它来确定用户。在这个扩展类的init()
函数中,我调用了Zend_Session::rememberMe(60 * 60 * 24 * 7)
,因为我认为这会延长会话的寿命,而实际上,它会生成一个新的会话,接收这个新的寿命。
虽然我已经解决了这个问题,但这让我想知道,为什么它以前没有失败,为什么它现在开始失败。