自己的项目随着不断开发迭代,越来越庞大,后台的接口也就越来越多,难免会有一些接口后来并没有使用到,但是还在代码中,权限管理的时候这部分接口是非常多余的,为了避免这个问题,本章提供了一个工具类。因为项目是前后端不分离的,只是一个后台管理,也没什么必要做成前后端分离,所以所有的前端js文件都会被编译到生成的target目录下。扫描js文件的目录,判断接口路径是否出现在文件中。
工具类代码如下:
package cn.edu.sgu.www.mhxysy.util;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
/**
* 接口路径扫描工具类,找出多余的接口
* @author heyunlin
* @version 1.0
*/
public class InterfaceScanner {
/**
* 递归扫描js文件,找出没有被引用的接口
* @param listFiles File[]
* @param list List<String>
* @return List<String>
* @throws IOException BufferedReader.readLine()抛出的异常
*/
public static List<String> loopFor(File[] listFiles, List<String> list) throws IOException {
List<String> interfaces = new ArrayList<>(list);
for (File listFile : listFiles) {
if (listFile != null) {
String name = listFile.getName();
System.out.println("当前正在扫描文件:" + name);
if (listFile.isDirectory()) {
interfaces = loopFor(Objects.requireNonNull(listFile.listFiles()), interfaces);
} else if (listFile.isFile()) {
FileInputStream fis = new FileInputStream(listFile);
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader isr = new InputStreamReader(bis);
BufferedReader br = new BufferedReader(isr);
String line;
// 判断有没有读到文件末尾
while ((line = br.readLine()) != null) {
// 打印读到的文件内容
System.out.println(line);
Iterator<String> iterator = interfaces.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (line.contains(next)) {
iterator.remove();
}
}
}
}
}
}
return interfaces;
}
}
接下来,写一个控制器接口,完成扫描的操作,并返回扫描结果。
package cn.edu.sgu.www.mhxysy.controller.system;
import cn.edu.sgu.www.mhxysy.entity.system.Permission;
import cn.edu.sgu.www.mhxysy.pager.system.PermissionPager;
import cn.edu.sgu.www.mhxysy.redis.RedisRepository;
import cn.edu.sgu.www.mhxysy.restful.JsonResult;
import cn.edu.sgu.www.mhxysy.restful.PageResult;
import cn.edu.sgu.www.mhxysy.service.system.PermissionService;
import cn.edu.sgu.www.mhxysy.util.InterfaceScanner;
import cn.edu.sgu.www.mhxysy.util.UserUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
import java.io.IOException;
import java.util.List;
@RestController
@Api(tags = "权限控制器类")
@RequestMapping(path = "/permission", produces = "application/json;charset=utf-8")
public class PermissionController {
private final PermissionService service;
private final RedisRepository redisRepository;
@Autowired
public PermissionController(PermissionService service, RedisRepository redisRepository) {
this.service = service;
this.redisRepository = redisRepository;
}
@ApiOperation("递归扫描js文件,找出没有被引用的接口")
@RequestMapping(value = "/interfaceScanner", method = RequestMethod.POST)
public JsonResult<List<String>> interfaceScanner() throws IOException {
// 指定扫描路径
String path = "D:/program/IdeaProjects/mhxysy/target/classes/static/js";
File directory = new File(path);
// 获取登录的用户名
String username = UserUtils.getLoginUsername();
// 获取用户所有权限的URL地址
List<String> list = redisRepository.get(username);
// 获取扫描路径下的所有子文件
File[] listFiles = directory.listFiles();
System.out.println("权限总数:" + list.size());
// 删除存放公共js文件的目录
for (int i = 0; i < listFiles.length; i++) {
File listFile = listFiles[i];
// 不扫描/js/public/*.js和/js/easyui/*.js
if ("public".equals(listFile.getName()) || "easyui".equals(listFile.getName())) {
listFiles[i] = null;
}
}
// 调用工具类的方法获取扫描结果
List<String> result = InterfaceScanner.loopFor(listFiles, list);
return JsonResult.success("扫描完成。", result);
}
}
因为/js/public和/js/easyui路径下存放的是项目的公共js文件,所以不用扫描
当然,可以把扫描路径作为接口的参数,不用在代码中指定,这样可以更加灵活
通过knife4j简单的测试了一下接口,发现确实扫描到了想要的结果
好了,文章就分享到这里了,如果文章的内容对你有所帮助,不要忘了点赞+收藏~