gpt4 book ai didi

java - urlrewrite 使用 Servlet 过滤器

转载 作者:行者123 更新时间:2023-11-30 09:44:43 24 4
gpt4 key购买 nike

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

示例:http://server/app/person/Roscoe将被翻译成 http://server/app/person.jsp?name=Roscoe

我的 FilterdoFilter 检查请求,如果模式匹配,则创建一个新的 HttpServletRequest 并将其传递给 链.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涵盖路径问题.

最佳答案

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

关于java - urlrewrite 使用 Servlet 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com