最近发现一个问题,从项目开始到现在,url 的路径要爆炸了,因此要看一下项目里所有 spring controller 的路径配置。正好前一段时间学了一点 python,就尝试使用 python 写个小程序扫描一下。
需要用到的python函数
- 读取文件夹
- 打开文件
- 读取文件内容
- 简单字符串处理
分析文件内容
读取文件使用 open函数,第一个参数为文件全路径,第二个参数为读写标识,'r'表示只读
file.readlines()函数直接把每一行读取出来,返回一个数组
遍历数据时使用了 enumerate 函数,这样可以同时得到行号
tuple是个好东西,简单的数据结构直接用 tuple 来实现,不需要新建一个数据结构或者对象了,函数返回一个 tuple 也可以让返回值变得更加丰富
def parse_springmvcfile(filepath, filename):
request_mapping = []
file = open(filepath + "/" + filename, "r")
is_spring_file = False
root_path = None
# 一行一行的读取文件
for linenum, line in enumerate(file.readlines()):
if is_spring_file: # 已经找到配置行说明该文件是 spring controller 文件
if "@RequestMapping" in line: # 找到 springmvc 路径配置行
if root_path is None:
root_path = get_cotroller_path(line) # 根路径
else:
request_mapping.append((linenum+1,root_path + get_cotroller_path(line))) # 解析路径字段
else: # 还没找到配置行说明该文件是 spring controller 文件,别干其它的,继续找
if "@Controller" in line:
is_spring_file = True
return is_spring_file, request_mapping
扫描文件夹
递归扫描文件夹,并将指定后缀的文件全路径放到数组中返回
数组的并接使用 extend 函数,使用 append 函数向数组中添加元素
def scanpath(filepath, suffix):
filelist = []
print("开始扫描【{0}】".format(filepath))
if not os.path.isdir(filepath):
print("【{0}】不是目录".format(filepath))
exit(-1)
for filename in os.listdir(filepath):
if os.path.isdir(filepath + "/" + filename):
filelist.extend(scanpath(filepath + "/" + filename, suffix))
else:
if filename.endswith(suffix):
filelist.append((filepath, filename))
return filelist
截取路径配置
controller 里的路径是配置成@RequestMapping("/路径"),要把里面的路径取出来,需要对字符串进行处理。我对正则不熟,只好用比较土的方法
def get_cotroller_path(request_mapping):
group = request_mapping.split("\"")
path = group[1]
if path.endswith("/"):
path = path[:-1]
if not path.startswith("/"):
path = "/" + path
return path
现在调用scanpath后使用parse_springmvcfile,就可以把所有controller 文件找到并显示里面所有的路径配置。
开会了开会了,有些路径要调整一下
:)