You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring项目无法提供静态文件服务问题求助(PDF访问场景)

Spring Boot 静态PDF文件无法访问问题排查

问题背景

我是Spring新手,正在开发图书馆REST API。添加书籍的逻辑如下:

  • 从SecurityContextHolder获取当前用户
  • 添加书籍并关联到用户书单
  • 将Base64编码内容转为字节流写入文件(此步骤执行正常),但写入后无法访问该PDF文件

已尝试的解决方案

方案1:映射静态资源到resources/static目录

编写了继承WebMvcConfigurer的ResourceConfig配置类,将/static/**路径映射到项目静态目录的绝对路径:

@Configuration
public class ResourceConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
        .addResourceHandler("/static/**")
        .addResourceLocations(StaticAbsolutePath.getPath());
    }
}

配套的路径工具类StaticAbsolutePath:

public class StaticAbsolutePath {
    private static final String path = "A:\\java\\projects\\books\\src\\main\\resources\\static";

    public StaticAbsolutePath() {
    }
    public static String getPath() {
        return path;
    }
}

同时在SecurityConfig中添加路径放行规则:

http.authorizeRequests().antMatchers("/static/**").permitAll();

但访问http://localhost:8080/static/1252356147.pdf时仍显示白标错误页。

方案2:迁移文件到外部存储目录

了解到resources/static更适合存放HTML、CSS等前端静态资源后,将PDF存储目录改为A:\downloads\,并修改ResourceConfig配置:

private static final String[] CLASS_PATH_RESOURCE_LOCATIONS = {
            "A:\\downloads\\"
    };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
        .addResourceHandler("/pdf/**")
        .addResourceLocations(CLASS_PATH_RESOURCE_LOCATIONS)
        .setCacheControl(CacheControl.noCache().cachePrivate())
        .resourceChain(true)
        .addResolver(new PathResourceResolver());
    }

调整后问题仍未解决。

完整配置代码

SecurityConfig完整代码

@Configuration @EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;
    private final BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        CustomAuthenticationFilter customAuthenticationFilter = new CustomAuthenticationFilter(authenticationManagerBean());
        customAuthenticationFilter.setFilterProcessesUrl("/api/login");
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/api/login/**").permitAll();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.authorizeRequests().antMatchers(HttpMethod.POST, "/api/users/").authenticated();
        http.authorizeRequests().antMatchers(HttpMethod.GET, "/api/user/current").authenticated();
        http.authorizeRequests().antMatchers(HttpMethod.POST, "/api/books/**").authenticated();
        http.authorizeRequests().antMatchers(HttpMethod.GET, "/api/books/**").permitAll();
        http.authorizeRequests().antMatchers(HttpMethod.PUT, "/api/books/**").authenticated();
        http.authorizeRequests().antMatchers("/static/**").permitAll();
        http.addFilter(customAuthenticationFilter);
        http.addFilterBefore(new CustomAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

求助

目前静态PDF文件仍无法通过浏览器访问,求可行的解决方法。

内容的提问来源于stack exchange,提问作者Cross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:54:26