从另一个servlet调用servlet过滤器

问题描述 投票:1回答:1

我正在做一个CMS。

我的代码是在 doGet() 的servlet函数 "/market". 我想要一个 HttpServletRequestWrapper 将通过所有为url设置的过滤器 "/page".

我希望这些过滤器能够更新请求,这样注释处理器就可以在以后注入具有正确值的依赖关系。

我在Tomcat服务器中,所以我应该可以投射到正确的特殊对象,我不需要符合其他服务器的要求。

一个相关的问题是,使用 req.getRequestDispatcher(path).forward(requestWrapper, responseWrapper);我期待着过滤器被调用。javadoc说:"它们应该被调用吗?

这个方法允许一个servlet对一个请求进行初步处理

servlets servlet-filters requestdispatcher
1个回答
0
投票

过滤器默认映射在 REQUEST 仅供调度员使用。下面是一个过滤器映射的例子

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

隐含着相当于

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

这意味着,过滤器只在 "原始 "传入请求上触发,而不是在转发请求上触发。

还有三个调度器。FORWARD, INCLUDEERROR. 该 RequestDispatcher#forward() 触发 FORWARD 派遣员。如果你想让你的过滤器也挂在上面,那么只需添加它。

<filter-mapping>
    <filter-name>yourFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

注意,你需要明确指定 REQUEST 调度器,否则它会认为你完全覆盖了它,而只对 FORWARD 派遣员。

在过滤器里面,如果你想区分一个。REQUESTFORWARD的请求属性,然后你就可以通过确定一个以 RequestDispatcher#FORWARD_REQUEST_URI

String forwardRequestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);

if (forwardRequestURI != null) {
    // Forward was triggered on the given URI.
}
© www.soinside.com 2019 - 2024. All rights reserved.