2015-04-08 2 views
0

У меня неприятная проблема с Wicket и Ajax на VMWare Horizon. Пользователи видят, что ajax-ссылки не работают должным образом. Точнее: они работают, но, похоже, действуют на более старую версию страницы. Например, когда у меня есть счетчик, он, похоже, обрабатывает ajax-update, но значение никогда не увеличивается. Значение сохраняется в Model, поэтому я решил, что это связано с сериализацией страницы.Wicket multi-tab ajax & page serialization

Я продолжал делать более простой эксперимент: на калибровочных картах (см.: http://www.wicket-library.com/wicket-examples/ajax/on-change-ajax-behavior) есть поле ввода. Если вы нажмете enter, значение будет отправлено на страницу. Это отлично работает на одной вкладке браузера.

Однако, если открыть две вкладки (по копированию вставки URL-адрес в новой вкладке, давайте назовем их и B). Я отправлю значение на вкладке A с помощью ввода. Я обновляю вкладку B и получаю значение, которое представлено на вкладке A.

Единственный способ, которым это может случиться, состоит в том, что они читают сериализованные страницы друг друга.

Как предотвратить такое поведение?

пс. Я использую Wicket версии 6.19.0, примеры калитки, кажется, запускают 6.x. ps2. Я заметил это поведение в Chrome.

ответ

2

Чтобы предотвратить это, вы должны убедиться, что на одной и той же странице нет двух или более вкладок (т. Е. С тем же идентификатором страницы). Вы можете использовать https://github.com/apache/wicket/blob/2f3b357703df3fe5c49580b3c46d4fd231208474/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java, чтобы получать уведомления, когда это произойдет. Просто сделайте setResponsePage(getPage().getClass()), чтобы начать с нового экземпляра.

+0

Спасибо @ martin-g, это выглядит полезно. Мне было интересно, можно ли создать новую «WebSession» для этой вкладки, чтобы все остальное «просто работало». Как вы думаете? – RobAu

+1

Сессия кодируется как файл cookie «JSESSIONID». Браузер отправляет его автоматически. Таким образом, все вкладки и окна являются одним и тем же пользователем на стороне сервера. Вы можете закодировать его в URL-адресе и явно удалить его для этой ссылки, но это ручная работа, которую вы должны сделать ... –

0

Это потому, что две вкладки работают за один сеанс.

Закладки не учитываются (поскольку они не известны серверу) для определения того, для какой сессии требуется запрос.

Если вы сделаете то же самое с двумя браузерами вместо двух вкладок, это сработает нормально.

+0

Спасибо @ Glenner003 за дополнительное объяснение. Тем не менее, я действительно хотел бы предотвратить это :) – RobAu

+0

Как именно вы открываете вторую вкладку? Вы также передаете параметры версии? Wicket затем отобразит страницу в том же состоянии (параметр версии используется, чтобы можно было поддерживать обратную кнопку) Если вы открываете вторую вкладку без каких-либо параметров версии, у вас должно быть 2 отдельных страницы. –