【发布时间】: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),但仍想自己编写,主要是为了学习和更好地控制。”
标签: java servlets url-rewriting servlet-filters