使用 Servlet 过滤器的 urlrewrite
Posted
技术标签:
【中文标题】使用 Servlet 过滤器的 urlrewrite【英文标题】:urlrewrite using Servlet filter 【发布时间】:2011-12-04 03:47:24 【问题描述】:我正在尝试使用 Servlet 的过滤器 (javax.servlet.Filter
) 编写一个简单的 urlrewriter。过滤器根据 URL 检查所有请求并重新路由到 servlet(或 JSP)。
示例:http://server/app/person/Roscoe 将被转换为 http://server/app/person.jsp?name=Roscoe
我的Filter
的doFilter
检查请求,如果模式匹配,则创建一个新的HttpServletRequest
并将其传递给chain.doFilter
。新的HttpServletRequest
扩展了javax.servlet.http.HttpServletRequestWrapper
并覆盖了参数、URI、URL、查询字符串和servlet 路径,看起来像新的JSP (/person.jsp?name=Roscoe
)。我认为通过将新请求传递给chain.doFilter
它将重定向到JSP。除了person.jsp
的内容被返回到浏览器之外,这有点工作。 person.jsp
从不执行内容以纯文本形式返回 (Content-Type: text/plain
)。
我的web.xml
有过滤器和过滤器映射:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
使用 Servlet 过滤器重写请求是否正确?
我知道现有的 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:路径问题被this question覆盖。
【问题讨论】:
你检查tuckey.org/urlrewrite了吗? “我知道现有的 urlrewriters(例如 Tuckey),但仍想自己编写,主要是为了学习和更好地控制。” 【参考方案1】:仅包装请求并更改其状态是不够的。您需要转发/重定向到适当的资源。过滤器和 servlet 映射到 URL 模式。您正在执行的链是根据传入请求的 URL 的模式构建的。更改请求中的 URL 并将其传递给链中的下一个项目不会重建链以考虑新 URL。这就是转发/重定向的用途。
【讨论】:
以上是关于使用 Servlet 过滤器的 urlrewrite的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Tuckey UrlRewrite Filter 在规则匹配后不调用chain.doFilter?