【问题标题】:Spring MVC Path Pattern Matching Doesn't Handle DashesSpring MVC 路径模式匹配不处理破折号
【发布时间】:2015-06-25 16:31:32
【问题描述】:

我有一个 @Configuration 类扩展 WebMvcConfigurerAdapter,其方法类似于:

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQuery-File-Upload*/**").addResourceLocations("/jQuery-File-Upload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

当尝试访问这些静态资源时,Spring 与配置的资源处理程序(404 错误或类似错误)不匹配 URL(例如 http://localhost:8080/app/jQuery-File-Upload-9.9.3/js/file.js)。如果我更改文件系统上的目录名称并从模式中删除 initial 破折号,那么它可以工作(例如使用http://localhost:8080/app/jQueryFileUpload-9.9.3/js/file.js):

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQueryFileUpload*/**").addResourceLocations("/jQueryFileUpload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

我尝试对此进行了一点调试,可以看到 Spring 使用 org.springframework.util.AntPathMatcher 来处理这些模式。该类中的代码虽然非常混乱,但我知道 Spring 过去曾有过与模式/路径相关的错误。这是另一个缺陷吗?如何修改上面的代码,使其无需像解决方法中那样删除破折号即可工作?

使用 Spring 4.1.6 和 Java 8。

更新

已删除的回复建议以某种方式“转义”破折号。请注意,以下内容也不起作用:

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
    final Integer CACHE_LONGTERM = 31536000;
    r.addResourceHandler("jQuery\\-File\\-Upload*/**").addResourceLocations("/jQuery-File-Upload-9.9.3").setCachePeriod(CACHE_LONGTERM);
}

【问题讨论】:

  • 您是否需要在jQueryFileUpload 上提供领先的/
  • @beerbajay -- 不,因为在有效的版本上也没有前导斜杠(上面的第二个 sn-p)。问题必须与破折号有关。
  • 你能把 spring 放在 trace 中并把日志放在里面吗?

标签: java regex spring spring-mvc ant


【解决方案1】:

给定以下配置:

@Override
public void addResourceHandlers(ResourceHandlerRegistry r) {
  r.addResourceHandler("/resources/foo-*/**").addResourceLocations("/static/");
}

GET /app/resources/foo-bar/file.js 之类的请求将尝试解决磁盘上的以下问题:/static/foo-bar/file.js。 Spring 正在获取请求的模式部分(根据您配置的模式) - 请参阅 AntPathMatcher.extractPathWithinPattern

所以在你的情况下,我认为它实际上是在尝试解决 "/jQuery-File-Upload-9.9.3/jQuery-File-Upload-9.9.3/js/file.js"

我已经设法在模式定义中使用"-" 解析资源。

如需更多指导,请将org.springframework.web.servlet.resource 的 LOG 级别更改为 DEBUG 应该会为我们提供更多信息。

如果您设法隔离并重现此问题,请create a repro project 和/或JIRA issue

【讨论】:

  • 谢谢,我会尽快再看一遍,并尝试做 repro 项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多