Java 使用Servlet过滤器重写URL

Java 使用Servlet过滤器重写URL,java,servlets,url-rewriting,servlet-filters,Java,Servlets,Url Rewriting,Servlet Filters,我正在尝试使用Servlet的过滤器(javax.Servlet.filter)编写一个简单的URL重写器。过滤器根据URL检查所有请求并将其重新路由到servlet(或JSP) 示例:将被翻译为 MyFilter的doFilter检查请求,如果模式匹配,则创建一个新的HttpServletRequest,并将其传递给chain.doFilter。新的HttpServletRequest扩展了javax.servlet.http.HttpServletRequestWrapper,并覆盖参数、U

我正在尝试使用Servlet的过滤器(
javax.Servlet.filter
)编写一个简单的URL重写器。过滤器根据URL检查所有请求并将其重新路由到servlet(或JSP)

示例:将被翻译为

My
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
从不执行以纯文本形式返回的内容(
内容类型:text/plain

My
web.xml
具有过滤器和过滤器映射:

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
这样做效果更好,但我的CSS文件(
styles.CSS
)仍然是相对于原始URL的,而它应该是相对于原始URL的


后续2:路径问题已包含在中。

仅包装请求并更改其状态是不够的。您需要转发/重定向到相应的资源。过滤器和servlet映射到URL模式。您在其中执行的链是基于传入请求的URL模式构建的。更改请求中的URL并将其传递给链中的下一个项目不会重建链以说明新URL。这就是转发/重定向的目的。

你检查过了吗?“我知道现有的URLRewiter(如Tuckey),但仍想自己编写,主要是为了学习和更好地控制。”
config.getServletContext().getRequestDispatcher("/person.jsp").forward(req, resp);