java - Spring MVC 路径模式匹配不处理破折号

标签 java regex spring spring-mvc ant

我有一个 @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 不匹配 URL(例如 http://localhost:8080/app/jQuery-File-Upload-9.9.3/js/file.js)与配置的资源处理程序(404 错误或类似错误)。如果我更改文件系统上的目录名称并从模式中删除 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);
}

最佳答案

给定以下配置:

@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

关于java - Spring MVC 路径模式匹配不处理破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29722644/

相关文章:

java - 向请求添加 header

python - 使用 BeautifulSoup 从页面源中提取数据值

python - 用于大量搜索替换对的正则表达式替换

java - Spring 启动测试: run tasks before and after all tests

java - Spring 奇怪的行为

java - Java中的优先级信号量

java - 使用正则表达式java更改组

javascript - 使用 Javascript 从 URL 字符串获取端口

spring - 如何在Spring Expression Language(SpEL)中连接两个字符串

java - 如何在Java中递归地获取树结构的所有叶子