1、Spring Boot方法说明
在 Spring Boot 中,若要让addResourceHandlers
优先加载 JAR 包内的资源,可通过合理设置资源位置的顺序来达成。因为 Spring 会按照资源位置配置的先后顺序进行搜索,所以把 JAR 包内的资源路径放在前面就能实现优先加载。
下面是一个配置示例:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations(
"classpath:/static/", // 优先加载JAR包内的资源
"file:./static/" // 再加载外部文件系统的资源
)
.setCachePeriod(3600)
.setUseLastModified(true);
}
}
配置说明
资源搜索顺序:Spring 会按照addResourceLocations方法中路径的顺序去搜索资源。在上述例子中,会先搜索 JAR 包内classpath:/static/路径下的资源,若找不到,才会去搜索外部文件系统file:./static/路径下的资源。
外部资源覆盖:要是你有覆盖 JAR 包内资源的需求,比如在测试或生产环境中,可以把外部资源路径添加到 JAR 包资源路径之后。
路径协议:
classpath:用于引用 JAR 包内的资源。
file:用于引用文件系统中的资源。
2、若依中调整静态资源加载方式
调整ResourcesConfig的addResourceHandlers(ResourceHandlerRegistry registry)方法,模块位置在ruoyi-framework\src\main\java\com\ruoyi\framework\config\ResourcesConfig.java文件中。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
//Spring Boot(static → public → resources → META-INF/resources)检查这些目录中的资源
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
/** swagger配置 */
registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
/** logo和img文件加载优先级配置,文件访问权限,由ShiroConfig.java配置*/
registry.addResourceHandler("/logo/**") //访问路径
.addResourceLocations(
"file:./static/logo/", //优先加载外部文件系统的资源,路径必须以‘/’结尾
"classpath:/static/logo/" //再加载JAR包内的资源
);
registry.addResourceHandler("/img/**")
.addResourceLocations(
"file:./static/img/",
"classpath:/static/img/"
);
}
如果需要调整权限,比如logo文件在登录前允许访问,需要在ShiroConfig.java的
ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)添加相应的过滤器,如:
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager)
{
CustomShiroFilterFactoryBean shiroFilterFactoryBean = new CustomShiroFilterFactoryBean();
// Shiro的核心安全接口,这个属性是必须的
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 身份认证失败,则跳转到登录页面的配置
shiroFilterFactoryBean.setLoginUrl(loginUrl);
// 权限认证失败,则跳转到指定页面
shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
// Shiro连接约束配置,即过滤链的定义
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// 对静态资源设置匿名访问
filterChainDefinitionMap.put("/favicon.ico**", "anon");
filterChainDefinitionMap.put("/ruoyi.png**", "anon");
filterChainDefinitionMap.put("/irootech.png**", "anon");
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/logo/**", "anon"); //logo
filterChainDefinitionMap.put("/html/**", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/docs/**", "anon");
filterChainDefinitionMap.put("/fonts/**", "anon");
filterChainDefinitionMap.put("/img/**", "anon"); //img
filterChainDefinitionMap.put("/ajax/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/ruoyi/**", "anon");
filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
filterChainDefinitionMap.put("/api/**", "anon");
...
3、文件位置
在jar包运行目录下,创建如下两个目录,对应的文件就会覆盖jar包中的同名文件
/static/logo
/static/img