Как работает UrlRewriteFilter

Written by elwood

Немного механики работы UrlRewriteFilter, который часто используется джаверами при создании приложений. И не только servlet-based, но еще и использующих портлеты. Исследовался конкретно JBoss portal 2.6.5, но всё это на 99% можно отнести к другим серверам приложений и сервлет-контейнерам.

1. Сначала исходный запрос (CoyoteRequest) обрабатывается томкатом, выделяя параметры, которые присутствуют в запросе. Допустим, запрос был такого вида:

http://localhost:8080/wiki/l/А?d=s&mmm=asd

Так вот, параметры d и mmm будут присутствовать в коллекции parameters вне зависимости от применённых маппингов.

2. После этого от запроса отрезаются параметры, и полученный URL попадает в фильтр URLRewrite.
Точнее, никто их не отрезает, естественно, но фильтр URLRewrite их попросту не учитывает.
Таким образом, на вход UrlRewrite filter поступает урл

http://localhost:8080/wiki/l/А

3. Найдя подходящий маппинг, UrlRewriteFilter применяет его к запросу, передавая в filterChain измененный запрос.
Следующие фильтры и итоговые сервлеты, а далее и портлет-контейнер, а потом и собственно портлеты увидят преобразованный запрос.

http://localhost:8080/wiki/?l=A

И тут мы видим, что первичные параметры d и mmm казалось бы утеряны, но не тут-то было ! При реврайтинге запроса UrlRewriteFilter сохранил их. Скорее всего, при инициализации замещающего запроса туда были сразу скопированы параметры исходного запроса, а потом уже дописаны те, которые получились при парсинге отреврайтенного запроса.

Для того, чтобы окончательно убедиться в правильности этих мыслей, необходимо посмотреть исходный код UrlRewriteFilter. Но пока, к сожалению, на это нет времени.

Заметьте, UrlRewriteFilter мапит только URL, а не целиком весь запрос с параметрами. Поэтому, если вам вдруг захочется сделать маппинг, который бы зависел от параметров, то у вас это не получится (предупреждаю, потому что сам как-то с этим столкнулся). UrlRewriteFilter будет попросту игнорировать параметры, поскольку на входе имеет только url. Но такая фича и не нужна, поскольку параметры, дописанные к реврайченным урлам, остаются в запросе, и вы можете попросту добавить логику обработки этих параметров в приложение.