使用Servlet过滤器重写java URL
我正在尝试使用Servlet的过滤器(javax.servlet.Filter
)编写一个简单的URL重写器。过滤器根据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
)
Myweb.xml
具有筛选器和筛选器映射:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
使用Servlet过滤器重写请求是否正确
我知道现有的URLEwriter(如Tuckey),但仍然想编写自己的URLEwriter,主要是为了学习和更好地控制
跟进:我还尝试通过执行以下操作来重定向而不是chain.doFilter
(其中req
是已包装的请求):
config.getServletContext().getRequestDispatcher("/person.jsp").forward(req, resp);
这工作得更好,但是我的CSS文件(styles.css
)仍然是相对于原始URLhttp://server/app/person/styles.css,而它应该是http://server/app/styles.css
后续行动2:路径问题由this question涵盖
# 1 楼答案
仅仅包装请求并更改其状态是不够的。您需要转发/重定向到相应的资源。过滤器和servlet映射到URL模式。您在其中执行的链是基于传入请求的URL模式构建的。更改请求中的URL并将其传递给链中的下一个项目不会重建链以说明新URL。这就是转发/重定向的用途