Java 使用Servlet过滤器重写URL
我正在尝试使用Servlet的过滤器(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
javax.Servlet.filter
)编写一个简单的URL重写器。过滤器根据URL检查所有请求并将其重新路由到servlet(或JSP)
示例:将被翻译为
MyFilter
的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
)
Myweb.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);