2011-10-09 57 views
1

我想使用Servlet的过滤器(javax.servlet.Filter)编写一个简单的urlrewriter。过滤器检查所有请求并根据URL重新路由到servlet(或JSP)。使用Servlet过滤器的urlrewrite

实施例: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覆盖。

+1

您是否检查过http://www.tuckey.org/urlrewrite/? – Adi

+1

“我知道现有的urlrewriters(比如Tuckey),但仍然愿意自己写,主要是为了学习和更好的控制。” –

回答

2

只是包装请求并改变它的状态是不够的。您需要转发/重定向到适当的资源。过滤器和servlet被映射到一个URL模式。您正在执行的链是基于传入请求的URL的模式构建的。更改请求中的URL并将其传递给链中的下一个项目不会重建链以考虑新URL。这就是前进/重定向的意义。