我有一个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调用
答案 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>