Динамическое основанное на хосте монтирование на Wicket - PullRequest
2 голосов
/ 06 июля 2011

У меня необычное требование для калитки.Я выбрал Wicket, потому что я сделаю свой веб-сайт ориентированным на дизайн, а его функции монтирования URL просто лучшие для SEO.К сожалению, я нашел удар.

Я хочу создать сайт с разными дизайнами для разных хостов.Этот сайт будет иметь несколько псевдонимов хоста (скажем, «abc.com», «abc.com.br», «abc.com.pl») - все они указывают на одну и ту же кодовую базу (т.е. на один и тот же экземпляр хоста tomcat).Эта часть уже запущена и работает, благодаря Tomcat и пользовательскому ResourceStreamLocator.

Теперь я хочу разные монтирования для разных хостов.Это означает, что «abc.com/page1», «abc.com.br/pagina1» и «abc.com.pl/strona1» должны указывать на одну и ту же страницу «Page1.class».Пользователи из «abc.com» не могут видеть «abc.com/pagina1» или «abc.com/strona1".

Как я могу сделать это« динамическое монтирование на хосте »?

Пожалуйста, обратите внимание, я не говорю о i18n.Я использую этот пример, потому что он прост для объяснения.

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Это требование довольно легко в Wicket 1.5. Вам просто нужно настроить пользовательский сопоставитель корневого запроса, который будет получать запрос перед всеми предопределенными (системными) сопоставителями запросов. Таким образом, вы можете проверить URL-адрес запроса и вернуться на соответствующую страницу или позволить обработчикам по умолчанию обработать URL-адрес, если он не соответствует ни одному из ваших сопоставлений.

См. Интерфейс приложения # setRootRequestMapper () и IRequestMapper. HttpsMapper и CryptoMapper работают таким образом.

Другой способ сделать то же самое - это #mount (IRequestMapper) с очень высоким IRequestMapper # getCompatibilityScore). Этот счет используется Wicket, чтобы решить, какой преобразователь использовать с корневым сопоставителем по умолчанию.

2 голосов
/ 06 июля 2011

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

Я не знаю, есть ли готовое решение для этого из одного веб-приложения, но если нетэто то, что я бы сделал.

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

Как этого добиться?

Расширьте класс WicketFilter (это фильтр сервлета, который связывает контейнер сервлета с Wicket).Этот класс имеет поле с именем webApplication, которое вам придется заменить на карту vhostname-application.(Это также означает копирование всего кода метода doFilter(), так что это не очень аккуратное решение. Это скорее взлом. В любом случае)

Это должно помочь, у вас будет одно отдельное приложениеэкземпляр на vhost.

Но ваши переменные сеанса по-прежнему будут совместно использоваться сайтами, что является плохой идеей.(На практике ваш браузер не будет отправлять файлы cookie, выпущенные одним виртуальным хостом другому виртуальному хосту, но если идентификатор URL-адреса сеанса вставлен в URL, вы можете пересекать виртуальные хосты таким образом.)

Чтобы избежать перепутывания сеансоввам также придется изменить метод getFilterConfig(), чтобы он возвращал разные конфигурации для разных экземпляров приложения.(Имя фильтра - это атрибут, который используется для префикса переменной сеанса.)

Я не уверен на 100%, что это будет работать, я не пробовал, но если вы не можете найти лучшего (и большеглавное, более чистое) решение, это ваш единственный вариант.

...