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
相关产品推荐
相关产品推荐

