Wicket 6 - Пользовательский JQuery-плагин вызывает StalePageException - PullRequest
0 голосов
/ 06 июля 2018

Я использую Wicket 6 для приложения и хотел создать плагин JQuery, который отслеживает активность пользователей.

Идея состоит в том, чтобы время от времени обновлять сеанс http, а если пользователь простаивал более x минут, инициируйте выход из системы / перенаправление (выполняется на стороне сервера). Все это с помощью Ajax.

Теперь, это первый раз, когда я работал с JQuery (или JS), поэтому ниже приведен результат обучения в 3 часа.

idleTimer = null;
idleWait = 12000;
var lastUserInteraction;
var lastServerInteraction;
(function($) {

  $(document).ready(function() {

    startTimer();

    $(document).bind("keypress click", function() {
      lastUserInteraction = Date.now();
      lastServerInteraction = new Date(document.lastModified).getTime();

      if ((lastServerInteraction - lastUserInteraction) < 8000) {
        restartTimer();
      }
    });

  });

  function startTimer() {

    window.console && console.log("TIMER STARTAD, " + idleWait + " millisekunder kvar");
    idleTimer = setTimeout(function() {

      window.location.reload(true);

    }, idleWait);

  }

  function restartTimer() {

    clearTimeout(idleTimer);
    window.console && console.log("RESTARTING TIMER");
    heartBeat();
    startTimer();
  }

  function heartBeat() {

    $.ajax({
      url: window.location.href,
      type: "HEAD",
      timeout: 1000,
      statusCode: {
        200: function(response) {
          console.log('Working!');
        },
        400: function(response) {
          console.log('Not working!');
        },
        0: function(response) {
          console.log('Not working!');
        }
      }
    });
  }
})(jQuery)

Этот код «работает» в том смысле, что он обновляет таймер и http-сессию в зависимости от активности пользователей (время ожидания установлено на сервере 10 секунд и здесь на клиенте 12 секунд). Он также выходит из системы и перенаправляет пользователя на страницу входа, если время сеанса истекло.

Однако всякий раз, когда я пытаюсь сделать какой-либо обратный вызов через любой из моих компонентов (текстовое поле, кнопка и т. Д.). это приводит к StalePageException.

Есть предложения? Моя кожа толстая, так что не сдерживайтесь от критики

Заранее спасибо

1 Ответ

0 голосов
/ 06 июля 2018

Проблема здесь:

$.ajax({
  url: window.location.href,
  ...});

StalePageException выбрасывается Wicket, когда пользователь пытается использовать страницу экземпляр , которая была обработана как минимум еще один раз с момента визуализации текущей страницы.

URL, созданные Wicket, выглядят так: some/path?11-22.path~to~component.33.

Здесь 11 - идентификатор страницы. Это уникальный идентификатор экземпляра страницы для текущего сеанса http.

22 - количество отображаемых страниц. Он показывает, сколько раз этот конкретный экземпляр страницы отображался.

33 - индекс поведения компонента. Это не интересно для этой проблемы.

Итак, 22 является причиной проблемы. Когда страница отображается с помощью Wicket, значение renderCount равно X. Затем при вызове Ajax по URL-адресу текущего экземпляра страницы Wicket увеличит значение renderCount на стороне сервера до X+1. Позже, когда вы нажмете на любую ссылку / кнопку на странице, Wicket отправит запрос с X и провалит сравнение на стороне сервера с X+1, и Wicket сгенерирует PageStaleException.

У вас есть несколько вариантов, чтобы избежать этого:

  • монтирование ресурса (см. Application.mountResourceReference). Это похоже на простой сервлет. Преимущества состоят в том, что ресурсы / сервлеты не сохраняют состояния и не будет никакой конструкции ответа. Все, что вам нужно, это отправить простой запрос GET (даже HEAD в порядке), чтобы обновить сеанс http
  • сделать запрос к /some/page (без строки запроса, ?11). Это создаст новый экземпляр этой страницы и, следовательно, не повлияет на текущий экземпляр. Но он выполнит всю работу, необходимую для визуализации этой страницы, например попадание в базу данных и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...