【问题标题】:How to configure spring filters for only paths configured by controller如何仅为控制器配置的路径配置弹簧过滤器
【发布时间】:2015-03-05 15:52:54
【问题描述】:

我有一个 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), "/*"); 
}

我的 spring rest 项目的示例 URL

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

spring MVC 项目的示例 URL

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

【问题讨论】:

  • 你能发布你的 spring mvc 和 spring rest 项目的 url 模式吗?
  • 所以可以安全地假设所有 mvc URL 都会有 app-ui 并且所有 rest 调用都会有 v1 吗??
  • @Arkantos,我的 mvc 生产 URL 将是 mydomain.com/index.html 或 mydomain.com/login 用于 ajax 调用。休息时,它将是 mydomain.com/v1/healthcheck。所以休息电话将有v1。 MVC 不会有 app-ui
  • 好的,你的静态文件有什么共同点吗? //your-domain/static/js/app.js 中的 static 之类的东西
  • @Arkantos,不。我认为我在这种情况下犯了一个错误。如果这给我带来不调用过滤器的任何性能优势,我可以将它们移动到静态。此外,目前所有动态内容 url 都是 domain.com/ - 没有额外的斜杠。如果它是 domain.com/pathto/something - 我们可以假设这是 spring mvc 项目的静态文件。对于休息,我根本没有任何静态文件,除了这个 favicon.ico 出现在我的请求中。我的服务器上没有它的文件。也许我应该为它设置一个控制器并返回空体?

标签: java spring spring-mvc


【解决方案1】:

您可以在url-pattern 中指定逗号分隔值,甚至可以使用多个url-pattern elements infilter-mapping`。但要使其正常工作,您需要在 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>

【讨论】:

  • 谢谢。这有帮助。现在由于路径更改,我正在尝试解决我的 cookie。我的 /api/something API 调用设置了 cookie,并且在 / 处运行的 JS 似乎无法访问它们。看起来像不同的问题,但如果您有任何问题,请指点。
  • 我可以在Java程序中创建cookie时简单地设置路径。没关系。谢谢。
  • 但是 cookie 是在域级别的,只要您的域对于所有动态内容都相同,您应该能够访问它们
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2011-09-11
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多