问题描述
1、更新头像,并跳转回列表页,发现显示不出来
2、但是前端获取用户头像的信息是在加载页面就会被调用的,同时前端也不存在所谓的缓存问题,因为没有动这部分代码。
但查看响应是能获得正确的信息(前端打印图片路径,后端打印路径一致)
3、原地刷新不会有效果
4、重启服务器,再次查看发现正确加载了
问题分析
通过查资料与实践发现,这是由于服务器的自我保护机制导致的现象,为了防止暴露绝对路径
SpringBoot 把静态的文件在启动的时候都会加载到classpath的目录下的,package时把static目录下的资源一起打包到了jar包或war包中,此时上传的图片并未传入启动了的项目中,所以访问不到。项目重启后又会打成新的jar包,包含上一次上传的的图片,此时才会在页面上显示
简而言之,就是图片上传到的是src包下,不是tagert包下,但程序运行用的是target包下的代码
问题解决
对于上述问题,可以通过配置静态资源映射解决:
创建config包,创建对应的xxxxConfig类,实现WebMvConfigurer接口的addResourceHandlers方法
如果需要映射两个路径,类似于这样就可以
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${code_img_path_local}")
private String codeImgPath;
@Value("${avatar_path_local}")
private String avatarPath;
/**
* 映射外部图片路径
* 解决更新图片后需要重启服务器才能解决的问题
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pic/captcha/**").addResourceLocations("file:"+codeImgPath);
registry.addResourceHandler("/pic/avatar/**").addResourceLocations("file:"+avatarPath);
}
}