Skip to content

springboot 静态资源访问

环境

springboot: 3.1.5

java:17

配置文件: src/main/resources/application.yml

项目结构:

src/
 └─ main/
     └─ resources/
         └─ static/
             └─ pdf/
                 └─ 1.pdf

需求:

  • 1.访问 1.pdf,不依赖接口浏览器直接浏览此文件
  • 2.拒绝访问时(HTTP ERROR 403)
  • 3.设置其他静态目录

Spring Boot 静态资源映射机制

Spring Boot 默认情况下就会把 src/main/resources/static 目录当成静态资源目录。也就是说:

要访问 src/main/resources/static/pdf/1.pdf 只需启动项目后,直接访问:http://ip:port/pdf/1.pdf

也就是说,放在 static/pdf/ 下的所有文件,都会自动映射到 http://ip:port/pdf/ 下面。

映射规则

优先级路径前缀对应目录
1️⃣/classpath:/META-INF/resources/
2️⃣/classpath:/resources/
3️⃣/classpath:/static/
4️⃣/classpath:/public/

这几个文件夹可能同时存在,如果但他们的映射路径都为 /

静态资源优先级查找顺序:

如果几个文件夹中都有相同的文件(如:在 staticpublic 文件夹内同时存在 1.pdf),那么Spring Boot 会根据上表中 优先级 的顺序来查找。

1.访问静态资源

直接访问:http://ip:port/pdf/1.pdf

2.拒绝访问时(HTTP ERROR 403)

如果在访问静态资源时出现了错误(HTTP ERROR 403),可能是项目中验证机制出现了问题

如果使用了类似 Spring Security的框架(哪怕是 spring-boot-starter-security 依赖在项目里),默认所有的路径都需要验证。

解决办法: 放行静态资源路径,在配置中将 /pdf/** 传入到 requestMatchers 方法中,使在访问此路径资源时可以放行。

java
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
          .csrf().disable()
          .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
          .and().authorizeHttpRequests()
          .requestMatchers("/users/login", "/users/code", "/pdf/**")
          .anonymous()
          .anyRequest().authenticated();

        http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
        http.logout().disable();

        return http.build();
    }
    ...
}

3.设置其他静态目录