首页 > 解决方案 > 从另一个 servlet 调用 servlet 过滤器

问题描述

我正在开发 CMS。

我的代码doGet()在 url 调用的 servlet 函数内"/market"。我想要一个HttpServletRequestWrapper可以通过为 url 设置的所有过滤器"/page"

我希望这些过滤器会更新请求,以便注释处理器稍后可以注入具有正确值的依赖项。

我在 Tomcat 服务器中,所以我应该能够转换到正确的特殊对象,并且我不必与其他服务器兼容。

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

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

标签: servletsservlet-filtersrequestdispatcher

解决方案


默认情况下,过滤器仅映射在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>

这意味着,过滤器仅在“原始”传入请求时触发,而不是在转发请求时触发。

还有另外三个调度程序FORWARDINCLUDEERRORRequestDispatcher#forward()触发FORWARD调度程序。如果你想让你的过滤器也钩住它,那么只需添加它:

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

请注意,您需要在REQUEST此处明确指定调度程序,否则它将假定您完全覆盖它并且只对FORWARD调度程序感兴趣。

在过滤器内部,如果您想区分 aREQUESTFORWARD,那么您可以通过确定是否存在以RequestDispatcher#FORWARD_REQUEST_URI

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

if (forwardRequestURI != null) {
    // Forward was triggered on the given URI.
}

推荐阅读