在春季启动项目中将CSS之类的静态文件放在哪里?


69

在我当前的spring-boot项目中,我的观点如下:

<link href="signin.css" rel="stylesheet"/>

引用静态CSS文件。运行项目并访问引用此文件的视图之一时,会收到404 not found错误或403未经授权的错误,具体取决于我将文件放在项目中的位置。

到目前为止,我尝试了以下方法:

src/main/resources/static/css (with this, I use css/signin.css instead of signin.css)

src/main/resources/templates/static/css (with this, I use css/signin.css instead of signin.css)

src/src/main/resources/templates/acesso (same folder of the html file)

什么类型的文件存储在正确的位置?

Answers:


95

下面src/main/resources/static的任何地方都是放置静态内容(如CSS,JavaScript和图像)的合适位置。静态目录从提供/。例如,src/main/resources/static/signin.css将从投放,/signin.csssrc/main/resources/static/css/signin.css从投放/css/signin.css

src/main/resources/templates文件夹用于视图模板,这些模板将由模板引擎(如Thymeleaf,Freemarker或Velocity等)转换为HTML。您不应在此目录中放置静态内容。

还要确保您没有@EnableWebMvc在应用程序中使用过,因为这将禁用Spring Boot对Spring MVC的自动配置。


2
对我来说很不幸,这里没有发布的解决方案对我
有用

1
要使Spring Boot使用src / main / resources / static作为默认位置,是否需要进行任何配置?除非我从具有完整URL的CDN加载它,否则它不会占用CSS。
莫哈韦沙漠

7
不,这是默认位置。只要确保您没有@EnableWebMvc在应用程序中使用过,因为这将禁用Spring Boot对Spring MVC的自动配置。
安迪·威尔金森

@AndyWilkinson大家好,当我必须在Spring Boot App中使用EnableWebMvc时,我可以知道如何处理这种情况。
Akash Goswami

为什么您必须使用@EnableWebMvc而不是WebMvcConfigurerAdapter
安迪·威尔金森

11

除了将其放置在任何地方src/main/resources/static而不使用之外@EnableWebMvc,您还需要授权访问您的jscss文件夹,尤其是如果您spring-boot-security在类路径中。您将添加如下内容:

@Configuration
@EnableWebSecurity
public class MainSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home", "/js/**", "/css/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

然后在您的HTML中:

<link rel="stylesheet"  href="/css/bootstrap.min.css">
<script src="/js/bootstrap.min.js"></script>

这对我有用。但是,从安全性POV来看这不安全吗?
Swapnil Ingle

如果您希望某些资源安全,则@SwapnilIngle修改您的antMatchers。
jpllosa

好,谢谢!但是,公开您的js和/或CSS资源是否是常见/好的做法?
Swapnil Ingle

9

您可以使用Thymeleaf http://www.thymeleaf.org/

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <link rel="stylesheet" th:href="@{/css/signin.css}"/>
</head>
<body>
</body>
</html>

请记住在html标记中添加xmlns和xmlns:th。

检查您的application.properties:

spring.resources.add-mappings=true

如果该键设置为false,则Spring Boot应用程序将不会加载任何资源。


这是行不通的。您必须将其放在此文件夹中。<您的项目文件夹> /src/main/resources/static/css/signing.css
Philip Rego,

1
最好的答案
Denees,


4

我使用Spring-Boot 2.0.2

我仍然保留@EnableWebMvc注释webConfig.java并覆盖addResourceHandlers()方法中以帮助浏览器通过http请求到达CSS和javascript文件。

这是webapp目录的结构

目录结构

webConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "example.com")
public class WebConfig implements WebMvcConfigurer {

    // =======================================
    // =             Bean Config             =
    // =======================================

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");

        return resolver;
    }


    // =======================================
    // =          Override Methods           =
    // =======================================

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pdfs/**")
                .addResourceLocations("/WEB-INF/pdfs/");

        registry.addResourceHandler("/css/**")
                .addResourceLocations("/WEB-INF/css/");

        registry.addResourceHandler("/js/**")
                .addResourceLocations("/WEB-INF/js/");
    }
}

index.jsp头标记:

<head>
    <title>Title</title>

    <!-- Custom styles for this template -->
    <link href="css/cover.css" rel="stylesheet">
</head>

希望对您有帮助。


现在可能没有帮助。在2014年提出了问题。尝试回答最近的问题。将帮助您和
我俩。...– MyTwoCents

@ Ashish451很抱歉,如果不是这种情况,但是如果答案是好的并且有帮助,那么回答旧问题也没错:)。meta.stackexchange.com/questions/23996/…–
tk3

不工作 尝试使用此registry.addResourceHandler("/WEB-INF/**").addResourceLocations("classpath:/WEB-INF/");
hamza saber

2

我发现,如果将signin.css放在src / main / resources / META-INF / resources / static / css / signin.css下,那么可以使用/css/signin.css来访问它

不知道为什么。


2

就我而言,要像这样在css和js文件夹中引用文件:

<script src="js/bootstrap.min.js"></script>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/carousel.css" rel="stylesheet">

我必须将文件夹放在webapp文件夹中。我具有以下文件夹结构:

Myapp

-src
     -main
           -java
           -resources
                    -static
                    -templates
           -webapp
                  -resources
                  -WEB-INF

我的意思是,如果我将css和js文件夹放在资源文件夹(位于main下)中,它将是:

<link href="../resources/css/carousel.css" rel="stylesheet">
<link href="../resources/css/bootstrap.min.css" rel="stylesheet">
<script src="../resources/js/bootstrap.min.js"></script>

如果我将它们放在静态文件夹中(在资源下),它将不起作用。


我真的工作吗?我不能让它与bootstrap.min.css或bootstrap.min.js之类的名称一起使用,而与在basename中无点的名称(如somestyle.css或somescript.js)完美兼容。见stackoverflow.com/questions/47722325/...
Marcoc1712


0

当我使用时:

src/main/resources/static/css.

我的观点有这一行:

<link rel="stylesheet" href="/css/signin.css" />

0
  • src /资源/静态/ css
  • src /资源/静态/ js
  • src /资源/静态/图像

如果您正在使用Spring Boot并检查spring安全性,请不要使用@EnableWebMvc。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.