Я пытаюсь написать простой 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 : путьвопрос охватывается этим вопросом .