1

我正在使用具有单个 DispatcherServlet 的 spring 2.5 应用程序。该应用程序还将与 Jersey 集成以提供 REST 服务。

我正在尝试过滤对应用程序的每个请求。Filter/OncePerRequestFilter(我都试过了)工作正常,但似乎应用程序为单个请求多次调用 doFilter/doInternalFilter。通过尝试另外三个不同的请求,结果发现其中有更多样式表/脚本文件的页面有助于更多的函数调用。

我在过滤器标准架构上做错了吗?有什么需要更改或添加到应用程序..

public class UnfepiRequestFilter extends OncePerRequestFilter{

    @Override
    protected void doFilterInternal (HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        System.out.println("Start filtering");

        filterChain.doFilter(request, response);

        System.out.println("Done Filtering");
    }

}

web.xml 文件:

<filter> 
    <filter-name>filterHeader</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
  </filter>
  <filter-mapping> 
    <filter-name>filterHeader</filter-name> 
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/myApp-servlet.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <display-name>myApp</display-name>
  <servlet>
    <servlet-name>myApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>myApp</servlet-name>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.action</url-pattern>
    <url-pattern>*.json</url-pattern>
  </servlet-mapping>

基本上这是在特定时间重定向或拒绝用户请求(用于维护任务或暂时使任何服务不可用)。是否有某种方法可以防止每个请求对过滤器进行多次调用。任何帮助,将不胜感激..

4

1 回答 1

1

好像你没有做错什么。每个请求只调用一次您的过滤器。然而这:

通过尝试另外三个不同的请求,结果发现其中有更多样式表/脚本文件的页面有助于更多的函数调用。

让我觉得您不了解浏览器加载网页的方式。网页上的每个资产(脚本、样式表、图像)都在其自己的请求中加载。没有链接资源的简单 HTML 应导致单个服务器调用。

于 2013-06-13T19:46:39.960 回答