用Springboot做一个项目的url管理器

前言

不积跬步无以至千里,不积小流无以成江河

最近参考了各大型权限系统。本着学习与仰慕的心态,决定自己写一个小小的demo来交一交自己的作业。 我们知道,常规的Shiro和Security这类型的框架,都是充满了各种各样的调用链,读起来是非常的蓝瘦。但是…奈何人家技术够牛批,功能够实用,所以还是有很多的企业以及个人项目中大量的使用了这些框架。


不多bb,这篇文章我们最主要的目的还是,通过前端的可视化界面来实现我们后端所有的url是否可以访问。这是一个很小的功能,但是,实用性还是很不错滴。具体效果看看图: ps:录屏工具我没找到,所以先欠着,我们在最后放实际图。


这个小demo,我大致的分为了两个功能,

    自定义注解+权限字段来实现接口的访问。 在管理页面对所有的url进行开启和关闭。
技术栈: springboot2.2.5以上 vue2 elementUI 以及部分的前端知识。这个demo并没有使用vue-cli来构建,因为实在是太简单了。

设计思路

1、首先,所有的url请求都会经过我们的拦截器,所以我们只需要在拦截器里面去拿到当前请求的url,做一次判断就可以。 2、这个判断什么呢?所以,我们首先得在项目启动时,获取到我们当前项目下的所有url对吧。 3、拿到所有的url之后,是不是就可以存数据库了 4、最后,我们只需要在拦截器注入我们的mapper,再根据接收到的url做一次查询,我们的数据库表字段写一个enable代表是否启用,如果这个url的enable属性是true,则可以通过这个拦截器。否则就不能通过,是不是这个道理。 5、所以,我们来看看拦截器怎么写的。 是不是很简单 那我再贴一张我的数据库设计,也是很简单。 tips:大家可能看到了我这儿写的doc,很好奇是怎么来的吗? 大家都用过swagger吧,swagger里面的Api注解里面的属性都熟悉吧。所以我这儿就自定义了一个注解,名为Doc,只需要写上这个注解,在这个注解上面写上我们的接口作用,然后通过动态代理的方法获取到方法上标注的注解,拿到里面的内容,不就可以了?

还有一个问题:我们怎么去获取到当前项目下的所有接口呢?换言之:我们怎么获取到当前项目下所有标了@Requestmapping注解的值呢? Springboot整合mvc的时候给我们提供了一个接口,叫做WebApplicationContext。这个接口可以获取到我们当前所有的web上下文。换个说法:这个接口的方法可以获取到所有的web请求的类以及方法以及注解。是不是很强大? 可能你们又有疑问,我们有些地方标的@GetMapping或者@PostMapping对吧,那怎么获取呢? 不用担心,我们所有的Mapping都是依赖了@RequestMapping,虽然我也不知道怎么做到的,但是事实上,我们获取了@RequestMapping注解的时候,其他的Mapping也都能拿到。有空了再去研究研究这个事情。
做完上面这些,那问题又来了。在什么时候去让这些接口保存在数据库呢? 答案是,项目启动的时候,也就是我们项目的main方法。我这儿采用的是@PostConstruct注解+方法来实现的,这儿也可以贴出我的代码。 常规的这种方法,他是同步的,如果我们的接口过多,必然会造成这儿的阻塞。所以,我又做了一个自定义线程池,将这一块交给异步去处理。所以你自然能看到我上面标注的@Async注解。

好了,思路说的差不多了,接下来就是我们的正式编码环节。

权限控制

结尾

很久没写文章了,所以不知道该怎么表达自己的想法。我将这个小demo放在了gitee仓库中,如果有需要参考的朋友可以自行去下载,里面包含了SQL文件。代码很简单,注释也都有。

经验分享 程序员 微信小程序 职场和发展