有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Servlet过滤器重写java URL

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

示例: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

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) 个答案

  1. # 1 楼答案

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