【问题标题】:Spring serving static contents with dot(s) in filenameSpring 在文件名中使用点提供静态内容
【发布时间】:2018-05-23 04:04:25
【问题描述】:

我想通过 Spring 提供由 npm 构建产生的网页,一切正常,但无论真正的后缀是什么(css、js 或html)。

目录树是这样的:

src/main/resource/resource
                  index.html
                  asset-manifest.json
                  favicon.ico
                  manifest.json
                  service-worker.js
                  static
                     css
                         main.fc656101.css
                         main.fc656101.css.map
                     js
                         main.91794276.js
                         main.91794276.js.map
                     media
                         banner.bdcf92f4.jpg
                         fontawesome-webfont.912ec66d.svg
                         ...

这是应用程序类:

@SpringBootApplication
public class Application {
   private static Logger log=Logger.getLogger(Application.class.getName());

@Bean
WebMvcConfigurer configurer () {
    return new WebMvcConfigurerAdapter() {

        @Override
        public void addResourceHandlers (ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/static/*").
                      addResourceLocations("classpath:/static/");
        }
        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {
            super.configurePathMatch(configurer);

            configurer.setUseSuffixPatternMatch(false);
        }
    };
}

public static void main(String[] args) {

    SpringApplication.run(Application.class, args);
}

为了调试问题,我手动重命名了一些文件并且它可以正常工作,因此我将问题限制为包含点的文件名。

我看到有人解决了类似的问题,在 RestControllers 的请求映射中添加 {variable:.+},但我没有控制器,所以我不知道该怎么做。

编辑:

我发现使用这种配置:

@Configuration
class ServletConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configurePathMatch(final PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
        configurer.setUseTrailingSlashMatch(false);
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }

}

现在它服务于所有 *.html,包括 page.01.html,但仍然不是 style.01.css 或 script.01.js。我认为是一个不同的问题,原来的问题由 ContentNegotiationConfigurer 解决。

【问题讨论】:

  • 为什么这个标签是 npm?这似乎与 node.js 无关。
  • 因为文件名中带点的静态内容是由 npm run build 命令生成的。
  • 我认为这与您的问题无关,因为我认为如果您手动创建这些文件也会发生同样的情况,对吧?如果不是,那是一件需要明确提及的重要事情。
  • 不,本身并不重要,从某种意义上说,无论您如何生成带有点的文件名,问题都会出现,但我认为这很重要,因为解释了为什么更改名称是禁止的去,所以它阻止了像“你为什么不简单地更改文件名?”这样的解决方案。或类似的。
  • 那么你应该明确提到这一点,但是标签本身应该特定于问题/问题,而不是枚举所有“相关”技术。

标签: java spring spring-mvc


【解决方案1】:

我写的这应该是一个非常愚蠢的问题......

问题是浏览器缓存和项目清理。请务必始终清除缓存(这很明显),但也要在更改配置后清除您提供静态内容的项目。停止并重新启动 JAVA 是不够的。

这花了我三天的时间,但现在正在工作,正确的配置是我发布的第一个,不需要 contentNegotiation 配置。

希望这可以为其他人节省一天的时间!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2021-06-19
    • 1970-01-01
    • 2019-10-20
    • 2017-10-24
    • 1970-01-01
    • 2011-03-13
    • 2015-12-14
    相关资源
    最近更新 更多