Я пытался использовать плагин jQuery.address
, чтобы создать несколько глубоких ссылок. Но как только я запустил функцию .change()
и запустил javascript, мое PHP-приложение бэкэнда вышло из системы.
Я пришел к выводу, что это должно быть потому, что каждый ajax-запрос, который я запускаю, похоже, генерирует session_id.
Если я пытаюсь отобразить идентификатор сеанса из preDispatch
, идентификатор сессии будет таким же, как в окне, в котором был запущен запрос.
Если я пытаюсь вывести его из postDispatch
, оно уже изменилось на что-то другое, и когда я обновляю главное окно, также изменяется идентификатор сеанса главного окна.
Что это может быть?
РЕДАКТИРОВАТЬ 26-06-2011 12: 00
Я нашел код, который, кажется, ломает мое приложение.
После того, как я перезагрузил страницу с помощью хеша (#
), я использую функцию внутри функции $.address.change()
, чтобы выяснить, какое состояние загружать. Поскольку мне довелось работать только с одной из трех панелей, которые есть в моем приложении, он просто проверяет один параметр, подобный этому:
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, и, таким образом, новый идентификатор сеанса не имеет никаких данных, связанных с этим.
Теперь проблема - если я не использую плагин jQuery.address, выходы из системы не происходят. Ajax работает просто отлично, но каждый ответ ajax имеет набор заголовков Set-Cookie
, который изменяет идентификатор сеанса главного экрана. Я думаю, что это как-то может быть связано с проблемой. Как мне избежать выхода из системы?
Кроме того, выход из системы происходит только в том случае, если я вызываю f.selectFromLeftPanel()
из функции $.address.change()
. Если я пропущу этот вызов, ajax сработает, идентификатор сессии все равно изменится, но не будет выхода из системы.