若依Ruoyi中优先从本地文件加载静态资源
1、Spring Boot方法说明
在 Spring Boot 中,若要让addResourceHandlers
优先加载 JAR 包内的资源,可通过合理设置资源位置的顺序来达成。因为 Spring 会按照资源位置配置的先后顺序进行搜索,所以把 JAR 包内的资源路径放在前面就能实现优先加载。
下面是一个配置示例:
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic 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文件中。
@Overridepublic 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"); //logofilterChainDefinitionMap.put("/html/**", "anon");filterChainDefinitionMap.put("/css/**", "anon");filterChainDefinitionMap.put("/docs/**", "anon");filterChainDefinitionMap.put("/fonts/**", "anon");filterChainDefinitionMap.put("/img/**", "anon"); //imgfilterChainDefinitionMap.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