urlrewrite с использованием фильтра сервлетов - PullRequest
2 голосов
/ 10 октября 2011

Я пытаюсь написать простой urlrewriter, используя фильтр сервлета (javax.servlet.Filter).Фильтр проверяет все запросы и перенаправляет сервлет (или JSP) в зависимости от URL.

Пример: http://server/app/person/Roscoe будет переведен в http://server/app/person.jsp?name=Roscoe

My Filter 's doFilter проверяет запрос и, если шаблон совпадает, создает новый HttpServletRequest и передает его chain.doFilter.Новый HttpServletRequest расширяет javax.servlet.http.HttpServletRequestWrapper и переопределяет параметры, URI, URL, строку запроса и путь сервлета, чтобы выглядеть как новый JSP (/person.jsp?name=Roscoe).Я думал, что, передав новый запрос на chain.doFilter, он перенаправит на JSP.Это работает, вроде как, за исключением того, что содержимое person.jsp возвращается в браузер.person.jsp никогда не выполняется, содержимое возвращается в виде простого текста (Content-Type: text/plain).

My web.xml имеет фильтр и отображение фильтра:

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Является ли это правильнымиспользовать фильтр сервлетов для перезаписи запроса?

Я знаю о существующих urlrewriters (таких как Tuckey ), но все же хотел бы написать свой собственный, в основном для изучения и для лучшего контроля.

Продолжение : я также попытался перенаправить вместо chain.doFilter, выполнив (где req - завернутый запрос):

config.getServletContext().getRequestDispatcher("/person.jsp").forward(req, resp);

Этоработает лучше, но мой CSS-файл (styles.css) по-прежнему относительно исходного URL http://server/app/person/styles.css,, тогда как он должен быть http://server/app/styles.css

Продолжение 2 : путьвопрос охватывается этим вопросом .

1 Ответ

2 голосов
/ 10 октября 2011

Недостаточно просто обернуть запрос и изменить его состояние.Вам нужно будет переадресовать / перенаправить на соответствующий ресурс.Фильтры и сервлеты сопоставляются с шаблоном URL.Цепочка, в которой вы выполняете, была построена на основе шаблона URL входящего запроса.Изменение URL-адреса в запросе и передача его следующему элементу в цепочке не приведет к перестройке цепочки для учета нового URL-адреса.Для этого и предназначен переадресация.

...