Объединение UrlRewriteFilter и struts 2 с параметрами get
-
22-08-2019 - |
Вопрос
Следуя моему более старому вопросу, мне удалось заставить переписывание URL работать несколько корректно для моего проекта struts, где URL-адреса, подобные search?q=blah
преобразуется в запросы search.action?q=blah
.Мы используем UrlRewriteFilter Фильтр UrlRewriteFilter для этого.Кажется, что это нормально перенаправляет в struts (если убедиться, что у него есть сопоставление фильтра с FORWARD), но когда ParametersIntercepter
запускает он, кажется, перехватывая каждый параметр дважды и добавляя запятую между ними.Итак, следующее:
search.action?q=blah
Устанавливает параметр q в объекте Критериев (см. Далее) равным:
[ blah, blah ]
Параметры задаются с помощью ModelDriven<Criteria>
Где Criteria - это простой класс с набором свойств, которые необходимо задать из строки GET .
Я затрудняюсь объяснить, почему это происходит.Кто-нибудь когда-нибудь видел что-нибудь подобное?Я делаю что-то не так в отношении фильтров / перехватчиков?
Редактировать:Кажется, что ParametersInterceptor
просто устанавливает параметры, содержащиеся внутри объекта ActionContext.Я не уверен (и не вижу никаких отладочных сообщений, указывающих), где эти значения устанавливаются в ActionContext .Кто-нибудь хочет уточнить, как все это должно работать?
Решение 2
Я не разгадал описанное выше странное поведение, но мне удалось обнаружить ошибку при перезаписи URL-адреса, страницы, на которых перенаправляются не на 'mySearch.action', а на 'mySearch.action?'.Использование перезаписи URL сейчас с фиксированным правилом и без учета параметров запроса, похоже, работает нормально.
Редактировать:В конце концов я проследил это до проблемы с настройкой urlrewritefilter для прослушивания как запроса, так и ПЕРЕСЫЛКИ.По-видимому, это приводит к тому, что параметры GET анализируются дважды.Однако я по-прежнему не включаю параметры запроса (поскольку это обычно все равно все запутывает), так что это может не решить проблему полностью.Хотя это наиболее вероятный виновник.
В частности, мое сопоставление фильтров теперь выглядит следующим образом:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Другие советы
На всякий случай, если вас все еще может заинтересовать дополнительная информация, знаете ли вы, что самые последние версии Struts2 (то есть 2.1.?) не налагают расширение .action
к вашим действиям?На самом деле, вам вообще не нужно никакого расширения!
Если мне не изменяет память, единственное требование состоит в том, чтобы в web.xml
, вы сопоставляете свой фильтр Struts2 (org.apache.struts2.dispatcher.FilterDispatcher
) к URL-шаблону: /*
<filter-mapping>
<filter-name>action2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
С этого момента a <s:url>
тег, появляющийся на странице с пустым расширением, в свою очередь, сгенерирует URL-адрес без расширения...