SpringBoot设置静态资源访问控制和封装集成方案
背景
最近在着手公司框架优化及项目实际应用,原先方案是springboot+html前后端分离单独部署,后端人员兼职前端开发,后续产品线业务进行优化,面向企业使用部分由移动网站人员负责设计开发,内部配置后台管理还是由后端负责,随着框架不停迭代与使用的项目越来越多,项目升级框架变得十分麻烦,后端部分可以通过maven私服进行版本迭代,后台管理页面升级则需要进行各个项目拷贝,所以决定对框架进行整合,将后台管理页面与框架后端代码进行整合发布。
结构设计
- 框架打包后台管理相关标准资源及页面(框架public文件夹)
- 项目使用框架,开发具体业务配置管理页面(项目static文件夹)
- 项目需要个性化框架页面时,在项目static文件夹建立与框架同目录同名称资源文件进行覆盖,访问时优先级高于框架目录
SpringBoot静态资源访问
自定义访问路径
自定义WebConfig实现WebMvcConfigurer,重写addResourceHandlers方法
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${system.projectName}")
private String projectName;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//第一个方法设置访问路径前缀,第二个方法设置资源路径
registry.addResourceHandler("/" + projectName + "*.woff</exclude>
<exclude>***.ico</exclude>
</excludes>
</resource>
<resource>
<filtering>false</filtering>
<directory>class="lazy" data-src/main/resources</directory>
<includes>
<include>***.ttf</include>
<include>**
File[] flist=file1.listFiles();
for (File f : flist) {
if(f.isFile()){
copyFile(f.getPath(),f2+"/"+f.getName()); //调用复制文件的方法
//System.out.println("原路径["+f.getPath()+"] 被复制路径["+f2+"/"+f.getName()+"]");
}else if(f.isDirectory()){
copyFileFolder(f.getPath(),f2+"/"+f.getName()); //调用复制文件夹的方法
//System.out.println("原路径["+f.getPath()+"] 被复制路径["+f2+"/"+f.getName()+"]");
}
}
}
public static void copyFileFolder(String sourceFolderPath,String targetFolderPath) throws IOException {
//创建文件夹
File file=new File(targetFolderPath);
if(!file.exists()){
file.mkdirs();
}
copy(sourceFolderPath,targetFolderPath);
}
public static void copyFile(String sourceFilePath, String tagretFilePath) throws IOException {
try {
InputStream in = new FileInputStream(sourceFilePath);
OutputStream out = new FileOutputStream(tagretFilePath);
byte[] buffer = new byte[2048];
int nBytes = 0;
while ((nBytes = in.read(buffer)) > 0) {
out.write(buffer, 0, nBytes);
}
out.flush();
out.close();
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static boolean delete(String fileName) {
File file =new File(fileName);
if (!file.exists()) {
//System.out.println("删除文件失败:" + fileName +"不存在!");
return false;
}else {
if (file.isFile())
return deleteFile(fileName);
else
return deleteDirectory(fileName);
}
}
public static boolean deleteFile(String fileName) {
File file =new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
//System.out.println("删除单个文件" + fileName +"成功!");
return true;
}else {
//System.out.println("删除单个文件" + fileName +"失败!");
return false;
}
}else {
//System.out.println("删除单个文件失败:" + fileName +"不存在!");
return false;
}
}
public static boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile =new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir +"不存在!");
return false;
}
boolean flag =true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i =0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
flag = deleteDirectory(files[i].getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
//System.out.println("删除目录失败!");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
//System.out.println("删除目录" + dir +"成功!");
return true;
}else {
return false;
}
}
}
外部静态资源访问与优先级设置
设置yml文件中的static-locations配置项,多个使用,隔开,同时指定顺序为访问的优先级
spring:
resources:
static-locations: classpath:static/,classpath:public/,file:static/
最终目录结构图如下,框架部分完全是项目启动时自动解压拷贝的,项目部分则是由具体项目进行开发,项目部分也可以很方便的进行框架部分功能重构,例如登录页,主页面修改等,本方式支持jar包和war包两种打包方式
到此这篇关于SpringBoot静态资源访问控制和封装集成方案的文章就介绍到这了,更多相关SpringBoot静态资源访问控制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341