Что-то переписывает идентификаторы сессии в Zend - PullRequest
2 голосов
/ 25 июня 2011

Я пытался использовать плагин 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 сработает, идентификатор сессии все равно изменится, но не будет выхода из системы.

1 Ответ

4 голосов
/ 26 июня 2011

Кажется, я нашел решение.

Во время запроса ajax я вызывал класс, который расширил Zend_Auth, который я использовал для определения пользователя. Что ж, в функции init() этого расширяющего класса я звонил Zend_Session::rememberMe(60 * 60 * 24 * 7), потому что я думал, что это продлевает срок жизни моего сеанса, тогда как в действительности он генерирует новый сеанс, который получает этот новый срок жизни. ,

Несмотря на то, что я решил эту проблему, меня удивляет, почему она не сбоила раньше и почему она начала сбоить сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...