使用 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

我的FilterdoFilter 检查请求,如果模式匹配,则创建一个新的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?

Chrome 无法呈现 tukey urlrewrite 输出网页

使用 Servlet 重写 Url

Servlet过滤器基础及使用场景

使用Servlet 编写过滤器

我们可以在 Spring Webflux 中使用 web servlet 和 servlet 过滤器吗?