利用aop我们可以实现业务代码与系统级服务例如日志记录、事务及安全相关业务的解耦,使我们的业务代码更加干净整洁。
最近在做数据权限方面的东西,考虑使用切面对用户访问进行拦截,进而确认用户是否对当前数据有访问权限,而我们的项目是springboot项目,所以花时间研究了下springboot下切面的实现。了解springcloud架构可以加求求:三五三六二四七二五九
1、首先加入相关maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2、编写控制器
@RestController public class HelloController { @RequestMapping("/add1") public String addData1(String deviceId) { return "success"; } @RequestMapping("/add2") public String addData2(String deviceId) { return "success"; } @RequestMapping("/add3") public String addData3(String deviceId) { return "success"; } }
3、配置切面
@Aspect @Component public class TestAspect { @Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..))") public void addAdvice(){} @Around("addAdvice()") public Object Interceptor(ProceedingJoinPoint pjp){ Object result = null; Object[] args = pjp.getArgs(); if(args != null && args.length >0) { String deviceId = (String) args[0]; if(!"03".equals(deviceId)) { return "no anthorization"; } } try { result =pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } return result; } }
这样下来我们就实现了一个简单切面,在切面中实现自己的数据安全认证,此处只做一个简单判断,测试如下:
4、但是这样的切面不够灵活,所以我们添加一个自定义注解
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { }
5、修改切面类
@Aspect @Component public class TestAspect { @Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)" ) public void addAdvice(){} @Around("addAdvice()") public Object Interceptor(ProceedingJoinPoint pjp){ Object result = null; Object[] args = pjp.getArgs(); if(args != null && args.length >0) { String deviceId = (String) args[0]; if(!"03".equals(deviceId)) { return "no anthorization"; } } try { result =pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); } return result; } }
6、修改控制器,给需要切面的方法上加上注解
@RestController public class HelloController { @MyAnnotation @RequestMapping("/add1") public String addData1(String deviceId) { return "success"; } @RequestMapping("/add2") public String addData2(String deviceId) { return "success"; } @RequestMapping("/add3") public String addData3(String deviceId) { return "success"; } }
通过自定义注解,我们可以灵活的添加切面,在需要使用切面的方法上添加注解,测试如下:
实际开发中我们可以将"execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)"改为"execution(public * com.example.demo.controller.*.*(..)) && @annotation(com.example.demo.controller.MyAnnotation)",这样在controller包下,只有我们加上@MyAnnotation注解的方法切面方法才会起作用。
相关推荐
基于SpringCloud Alibaba+SpringBoot+MybatisPlus+ElasticSearch搭建的商城项目; 系统对接了腾讯第三方:短信、图片等功能。只需要替换对应的key即可使用^_^
报表后端采用技术: SpringBoot整合SSM(Spring+Mybatis-plus+ SpringMvc),spring security 全注解式的权限管理和JWT方式禁用Session,采用redis存储token及权限信息 报表前端采用Bootstrap框架,结合Jquery Ajax,...
SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权
SpringBoot+SpringSecurity+JWT+MybatisPlus实现基于注解的权限验证,可根据注解的格式不同,做到角色权限控制,角色加资源权限控制等,粒度比较细化。 @PreAuthorize("hasAnyRole('ADMIN','USER')"):具有admin或...
shiro作为安全框架,主流技术 几乎零XML,极简配置 两套UI实现(bootstrap+layer ui),可以自由切换 报表后端采用技术: SpringBoot整合SSM(Spring+Mybatis-plus+ SpringMvc),spring security 全注解式的权限管理和...
SpringCloud分布式微服务项目Common通用依赖模块抽离示例代码 SpringCloud分布式微服务项目Common通用依赖模块抽离示例代码 SpringCloud分布式微服务项目Common通用依赖模块抽离示例代码 SpringCloud分布式微服务...
本项目用于部署至Linux服务器案例项目 该项目技术栈为:SpringBoot + Spring Security + Vue + ElementUI 前后端分离实现整体项目 一个简单的前后端分离项目
运用SpringBoot+Dubbo+Zookeeper实现的分布式微服务,分服务端与客户端。
Springboot+SpringSecurity+SpringSession+Redis+Mybatis-Plus+Swwager
spring-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新,可更新实例对象,包含源码包+Rabbitmq安装包和安装说明
1.传统spring boot框架 2.security框架 3.jwt取代session 4.mybatis-plus+mysql【sql文件项目中有】 5.不想下载,可以看博客,博客中有写
SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例 SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例 SpringCloud分布式微服务项目搭建构造父子模块依赖...
Java开发基于SpringBoot+WebSocket+Redis分布式即时通讯群聊系统。一个基于Spring Boot + WebSocket + Redis,可快速开发的分布式即时通讯群聊系统。适用于直播间聊天、游戏内聊天、客服聊天等临时性群聊场景。 ...
Java开发案例-springboot-37-整合spring-retry实现服务重试-源代码+文档.rar Java开发案例-springboot-37-整合spring-retry实现服务重试-源代码+文档.rar Java开发案例-springboot-37-整合spring-retry实现服务重试-...
用户管理模块基于Spring Security的用户登录、退出操作,以及用户查询、添加、详情等操作;角色管理模块,通过权限关联与控制给用户赋予角色(管理员角色和普通用户角色);资源权限管理模块给不同的角色关联不同的...
SpringBoot + mybatis-plus + druid 实现mySql与Orcl双数据源
Spring Cloud分布式微服务实战视频教程(养成应对复杂业务的综合技术能力),2020新课!附完整源码,这是一门培养应对复杂业务的综合技术能力的实战课程,本课采用前后端分离开发模式,严格遵守企业级架构和规范,带...
wx067 汉中茗茶微系统-springboot+vue+uniapp-小程序.zip 汉中茗茶微系统是一个很好的项目,结合了后端(Spring Boot)、前端(Vue.js)和 uniapp 技术,实现了前后端分离。
基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于...
基于 SpringCloud + SpringBoot + vue 构建的即时通讯系统源码.zip