如何仅为控制器配置的路径配置弹簧过滤器

时间:2015-03-05 15:52:55

标签: java spring spring-mvc

我有一个Spring MVC项目和一个Spring rest项目。在这两种情况下,我都使用过滤器为SLF4J / Logback日志记录添加会话ID。但是,每个HTTP请求都会调用过滤器,如静态文件,favicon.ico等。我知道这种情况正在发生,因为我在过滤器中使用了/ *。怎么预防这个?我希望只为我的控制器处理的路径调用过滤器。这是我在web.xml中设置的过滤器

<filter>
        <filter-name>AppRequestFilter</filter-name>
        <filter-class>com.company.appui.filter.AppRequestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AppRequestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

我在java程序中配置过滤器的另一个应用程序

private void registerFilters(Environment environment, ApplicationContext context) { 
    environment.addFilter(context.getBean(AppRequestFilter.class), "/*"); 
    environment.addFilter(context.getBean(AuthFilter.class), "/*"); 
}

我的春假计划的示例网址

localhost:8080/v1/apphealthcheck/epp?token=37e11b48119d

spring MVC项目的示例网址

localhost:28082/app-ui/index.html - 主页 localhost:28082/app-ui/login - 来自index.html的ajax调用

2 个答案:

答案 0 :(得分:1)

您可以通过在开头为所有控制器处理的请求添加特定的URL路径分支并将过滤器映射到该URL来解决此问题。 重构是否为时已晚?在开发过程中,宁静的服务通常是这样灵活的......

答案 1 :(得分:1)

您可以在url-pattern中指定逗号分隔值,甚至可以使用多个url-pattern elements in过滤器映射。但要实现这一点,您需要在MVC控制器URL和REST URL中使用公共前缀。

现在,您可以在web.xml中使用以下映射

  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/app/*,/v1/healthcheck/*</url-pattern>
  </filter-mapping> 

  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/app/*</url-pattern>
    <url-pattern>/v1/healthcheck/*</url-pattern>
  </filter-mapping>