Wicket 6 - Пользовательский JQuery-плагин вызывает StalePageException
Я использую 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 ответ
Проблема здесь:
$.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
). Это создаст новый экземпляр этой страницы и, следовательно, не повлияет на текущий экземпляр. Но он сделает всю работу, необходимую для рендеринга этой страницы, например попадание в базу данных и т. Д.