【问题标题】:Invoke servlet Filters from another servlet从另一个 servlet 调用 servlet 过滤器
【发布时间】:2020-08-19 20:20:21
【问题描述】:

我正在开发 CMS。

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

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

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

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

此方法允许一个 servlet 对一个 请求

【问题讨论】:

    标签: servlets servlet-filters requestdispatcher


    【解决方案1】:

    默认情况下,过滤器仅映射到 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 调度程序感兴趣。

    在过滤器中,如果您想区分REQUESTFORWARD,则可以通过确定是否存在以RequestDispatcher#FORWARD_REQUEST_URI 为键的请求属性来检查

    String forwardRequestURI = (String) request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);
    
    if (forwardRequestURI != null) {
        // Forward was triggered on the given URI.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      相关资源
      最近更新 更多