我想使用Servlet的过滤器(javax.servlet.Filter
)编写一个简单的urlrewriter。过滤器检查所有请求并根据URL重新路由到servlet(或JSP)。使用Servlet过滤器的urlrewrite
实施例: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覆盖。
您是否检查过http://www.tuckey.org/urlrewrite/? – Adi
“我知道现有的urlrewriters(比如Tuckey),但仍然愿意自己写,主要是为了学习和更好的控制。” –