Spring Boot静态资源加载失败:CSS/图片MIME类型异常求助
核心问题定位
谷歌控制台的MIME类型错误说明:请求静态资源时返回的不是CSS/图片文件,而是JSON格式响应(比如404提示、登录重定向后的JSON内容),而非预期的静态资源文件。结合你的配置,主要问题出在Spring Security路径匹配逻辑和静态资源引用路径上。
具体修复方案
1. 修正Spring Security配置的路径匹配逻辑
你的当前配置中,antMatchers第一个就写了"/**"并设置permitAll,这会导致所有请求都被允许,后续的anyRequest().authenticated()完全失效,同时可能因路径匹配优先级问题,静态资源请求被意外拦截或重定向。
修改后的filterChain方法:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() // 先配置需要公开访问的具体路径,顺序越具体越靠前 .antMatchers("/h2-console/**", "/webjars/**", "/img/**", "/style/**", "/dist/**", "/css/**", "/js/**", "/static/**") .permitAll() // 其余所有请求都需要认证 .anyRequest().authenticated() .and().formLogin() .loginPage("/login").defaultSuccessUrl("/") .permitAll() .and().logout() .logoutSuccessUrl("/") .permitAll() .and().httpBasic() .and().exceptionHandling().accessDeniedPage("/403"); http.headers().frameOptions().sameOrigin(); http.csrf().disable(); return http.build(); }
- 移除了
"/**"这个宽泛的匹配规则,确保只有明确指定的静态资源路径被公开访问 - 保持路径匹配顺序:具体路径优先于通用规则
2. 检查静态资源的引用路径
页面中引用静态资源时,必须使用绝对路径(以/开头),避免因当前页面URL不同导致路径解析错误。比如:
<!-- 正确写法 --> <link rel="stylesheet" href="/style/style.css"> <img src="/img/logo.png"> <!-- 错误写法(相对路径,易导致解析错误) --> <link rel="stylesheet" href="style/style.css">
3. 确认静态资源的物理位置
确保静态文件确实存放在Spring Boot默认的静态资源目录下:src/main/resources/static/,比如:
- CSS文件路径:
src/main/resources/static/style/style.css - 图片路径:
src/main/resources/static/img/logo.png
关于<security:intercept-url>的说明
<security:intercept-url pattern="/ressources/**" access="permitAll" />是XML风格的Spring Security配置语法,作用和Java配置中的.antMatchers("/ressources/**").permitAll()完全一致:允许所有用户访问/ressources/**路径下的资源。
它需要放在Spring Security的XML配置文件(如applicationContext-security.xml)的<http>标签内部,但目前Spring Boot推荐使用你当前的Java配置方式,因此无需使用该XML配置。
内容的提问来源于stack exchange,提问作者duckduckpo

