【问题标题】:Spring Boot static content with context path带有上下文路径的 Spring Boot 静态内容
【发布时间】:2016-12-11 19:45:49
【问题描述】:

我在使用上下文路径时遇到了 Spring Boot 中的静态内容问题。即:我希望将我的应用部署到localhost:8080/{appname}/

当我在没有上下文路径的情况下运行应用程序时,一切正常,Spring Boot 找到并运行我的 .html 文件(来自资源/模板/,我正在使用 Thymeleaf)和 JS 文件(来自资源/静态/js /) 但是当我添加上下文路径时:

server.context-path=/{appname}

server.servlet-path=/{appname}

那么.html页面仍然显示由JS文件生成404错误

我尝试更改application.properties 中的spring.resources.static-locations 并覆盖我的MvcConfig.class 中的addResourceHandlers() 方法,但似乎都不起作用

我使用MvcConfig 类,因为我需要定义CookieLocaleResolverMessageSource,但这就是MvcConfig 中的全部内容。我不使用@EnableWebMvc,只使用带有@ComponentScan@SpringBootApplication 注释。

任何帮助将不胜感激:)

【问题讨论】:

  • 你能粘贴你的配置和目录结构吗?
  • js文件的预期URL是404ing吗?还是HTML引用的JS文件是404ing? (例如,HTML 在没有应用上下文的情况下引用 JS 的问题,或其他问题)
  • @rhinds HTML 引用了没有应用上下文的 JS
  • 为了将来的参考,我将在这里添加一个简短的评论,因为我认为很多人使用 spring-boot 和 react 客户端的组合。我在反应时遇到了完全相同的症状,并通过在package.json 中设置homepage 并使用与在application.yml 中设置context-path 相同的字符串来解决它。 IE。 context-path: /foobar 必须与"homepage": "/foobar" 一起使用

标签: java spring spring-boot


【解决方案1】:

下面是一个例子,展示了如何在spring boot中配置静态资源。

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**/*.js").addResourceLocations("/ui/static/");
        registry.addResourceHandler("/**/*.css").addResourceLocations("/ui/static/");
    }
}

路径模式

添加一个资源处理程序,用于根据指定的 URL 路径模式提供静态资源。将为每个与指定路径模式之一匹配的传入请求调用处理程序。

允许使用“/static/”或“/css/{filename:\w+\.css}”} 等模式。 有关语法的更多详细信息,请参阅 **org.springframework.util.AntPathMatcher

你的 jsp/html 看起来像下面这样引用静态内容

<link href="/webAppContext/cssa/bootstrap.min.css" rel="stylesheet"/>
<script src="/webAppContext/jquery-2.2.1.min.js"></script>
<script src="/webAppContext/bootstrap.min.js"></script>

浏览器尝试获取静态内容的网址

http://localhost:8080/webAppContext/jquery-2.2.1.min.js
http://localhost:8080/webAppContext/bootstrap.min.js
http://localhost:8080/webAppContext/cssa/bootstrap.min.css


server.servlet.context-path=/webAppContext is in your application.properties

【讨论】:

    【解决方案2】:

    根据您的评论:

    HTML 引用了没有应用上下文的 JS

    问题不在于 Spring 为 js 提供服务,而是页面未正确创建资源的 URL。

    Thymeleaf 提供了一种机制来自动支持这一点,只需用 th 前缀标记 src 属性。

    参见第 2 节“上下文相关 URL”:www.thymeleaf.org/doc/articles/standardurlsyntax.html

    【讨论】:

    • 解决了问题,谢谢!我之前实际上已经用 @{/js/jquery-2.2.3.min.js} 做过测试,但我认为其他东西也坏了,我用普通的
    【解决方案3】:

    我的配置是:

    @Configuration
    public class MvcConfig extends WebMvcConfigurerAdapter  {
    
        public static final Logger LOG = LoggerFactory.getLogger(MvcConfig.class);
    
        @Bean
        public LocaleResolver localeResolver() {
    
            CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
            cookieLocaleResolver.setCookieName("language");
            cookieLocaleResolver.setCookieMaxAge(-1);
            cookieLocaleResolver.setDefaultLocale(Locale.FRENCH);
            return cookieLocaleResolver;
        }
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:i18n/lang");
            messageSource.setDefaultEncoding("UTF-8");
            return messageSource;
        }
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new Urli18nRewriterInterceptor());
        }   
    }
    

    及文件夹结构:

    folder structure

    【讨论】:

    • 您不应该将配置添加为答案,而应将其添加到您的问题中。
    猜你喜欢
    • 2018-10-01
    • 2018-05-17
    • 2020-01-20
    • 2018-02-10
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2020-09-06
    • 2019-07-20
    相关资源
    最近更新 更多