Ошибка AJAX сеанса в приложении Tapestry - PullRequest
7 голосов
/ 17 сентября 2010

Я создаю веб-приложение, используя Tapestry в сочетании с Spring Security и jQuery-библиотекой, кроме Prototype.Когда пользователь нажимает на ссылку после истечения времени ожидания сеанса, он автоматически перенаправляется на страницу входа.Это, конечно, не работает для ссылок, которые запускают AJAX-запрос.

Я знаю, что это распространенная проблема с любым видом веб-приложений (например, http://www.openjs.com/articles/ajax/session_timeout.php). Есть ли лучшийпрактическое решение для Tapestry 5?

EDIT У меня работает следующее решение (спасибо Хеннингу):

Ajax.Responders.register(
{
    onException: function()
    {
        window.location.reload();
    }
});

В случае сбоя во время AJAX-вызовазапускается перезагрузка страницы, которая в результате перенаправляет на страницу входа в систему. Она все еще нуждается в некоторой настройке (например, отображает сообщение об ошибке вместо перенаправления), но использование Ajax.Responders в основном кажется хорошим способом сделать это.

Ответы [ 3 ]

5 голосов
/ 17 сентября 2010

Для AJAX, использующего Prototype, вы можете добавить глобальный прослушиватель, который реагирует на сбои AJAX, используя AJAX.Responders ;jQuery имеет аналогичную конструкцию под названием Ajax Events , которую вы можете использовать.

Оба обработчика событий должны просто перенаправить на страницу входа при ошибке 403.Вы можете создать mixin с этой функцией и добавить его в свой компонент макета.

Я также использовал механизм, который предотвращает тайм-ауты сеанса, пока приложение все еще открыто в окне браузера, простовыполнение вызова AJAX и получение пустого ответа каждые пару минут, таким образом, сохраняя сеанс открытым.Глупо, но работает нормально.

3 голосов
/ 08 октября 2010

Вы можете добавить главного диспетчера T5


public class AjaxAccessController implements Dispatcher {

    @Override
    public boolean dispatch(Request request, Response response) throws IOException {

        // Si no hay session y la petición es ajax, recargar la página
        Session session = request.getSession(false);
        if (session == null && request.isXHR()) {
            OutputStream os = response.getOutputStream("application/json;charset=UTF-8");
            os.write("{\"script\":\"window.location.reload();\"}".getBytes());
            os.flush();
            return true;
        }

        return false;
    }
}

В вашем AppModule.java


public static void bind(ServiceBinder binder) {
        // binder.bind(MyServiceInterface.class, MyServiceImpl.class);
        // Make bind() calls on the binder object to define most IoC services.
        // Use service builder methods (example below) when the implementation
        // is provided inline, or requires more initialization than simply
        // invoking the constructor.

        // Id de AjaxAccessController
        binder.bind(AjaxAccessController.class).withId("AjaxAccessController");
    }

public void contributeMasterDispatcher(
            OrderedConfiguration configuration,
            @InjectService("AjaxAccessController") Dispatcher accessController) {

        configuration.add("AjaxAccessController", accessController, "before:ComponentEvent");
    }

Таким образом, при каждом запросе ajax без сеанса страница будет перезагружаться и перенаправляться в ваш индексстраница

0 голосов
/ 17 сентября 2010

Хорошо, на сервер сделан Ajax-запрос, он отправляет заголовок «HTTP_X_REQUESTED_WITH» со значением «XMLHttpRequest».Вы можете просто проверить на стороне сервера, является ли это ajax-запросом с указанным выше заголовком и условием для входа в систему и времени ожидания сеанса, прежде чем продолжить на странице индекса.

Если ваши критерии соответствуют, то просто напечатайте "window.top.location.href = 'страница входа' 'в вашей функции.

В PHP я могу сделать это как,

<?php if($_SERVER['HTTP_X_REQUESTED_WITH'] === "XMLHttpRequest" && condition for session check){
    echo "<script>window.top.location.href='login.php'</script>";
    }

?>

Вы можете добавить условие, подобное этому, в вашей структуре.

...