案例一、角色校验

  项目中,对某些方法需要用户具备指定角色权限才能执行。

/**
* 角色校验注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HasRole {
String[] value() default {};
}
/**
* 角色校验切面
*/
@Component
@Aspect
@Order(0)
public class RoleAspect {
@Autowired
private UserService userService; // 切入点
@Pointcut("@annotation(com.demo.annotation.HasRole)")
private void pointCut() {} // 前置通知,在执行目标方法之前执行
@Before("pointCut()")
public void checkRole(Joinpoint joinpoint) {
Signature signature = joinpoint.getSignature();
MethodSignature methodSignature = null;
// 判断注解作用对象是否为方法
if (!(signature instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
methodSignature = (MethodSignature) signature;
// 获取当前访问的class
Class<?> className = joinpoint.getTarget().getClass();
// 获取当前访问的方法名
String methodName = methodSignature.getName();
// 获取当前访问的方法形参类型
Class[] argClass = methodSignature.getParameterTypes();
// 获取当前访问的方法对象
Method method = className.getMethod(methodName, argClass);
// 获取当前访问的方法上的注解
HasRole hasRole = method.getAnnotation(HasRole.class);
// 校验权限,去数据库查是否有该权限
if (!userService.hasRole(hasRole.value())) {
// 抛出自定义权限异常
throw new AuthorizationException("无权限");
}
}
}
/**
* 目标对象
*/
@Controller
public class DemoController {
// 目标方法,NeedRole:定义了角色权限的枚举类
@PostMapping
@HasRole("NeedRole.ADMIN")
public void demoMethod(String arg) {
System.out.println("角色校验");
}
}

Spring-AOP之工作实践(一)的更多相关文章

  1. Spring aop 原始的工作原理的理解

    理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...

  2. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  3. spring Aop设计原理

    转载至:https://blog.csdn.net/luanlouis/article/details/51095702 0.前言 Spring 提供了AOP(Aspect Oriented Prog ...

  4. springmvc 运行原理 Spring ioc的实现原理 Mybatis工作流程 spring AOP实现原理

    SpringMVC的工作原理图: SpringMVC流程 . 用户发送请求至前端控制器DispatcherServlet. . DispatcherServlet收到请求调用HandlerMappin ...

  5. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  6. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

  7. Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探

    由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...

  8. Spring学习之旅(六)Spring AOP工作原理初探

    AOP(Aspect-Oriented  Programming,面向切面编程)是Spring提供的关键技术之一. AOP基于IoC,是对OOP(Object-Oriented Programming ...

  9. 【AOP】Spring AOP基础 + 实践 完整记录

    Spring AOP的基础概念 ============================================================= AOP(Aspect-Oriented Pr ...

  10. [转]彻底征服 Spring AOP 之 实战篇

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

随机推荐

  1. pyppteer下

    目录 启动pyppteer 切图 获取响应头,响应头状态,cookies 获取当前页面标题 获取页面html 第一种:获取整个页面html 第二种:只获取文本 注入JS,控制上下滚动 选择器 获取元素 ...

  2. Django之ORM属性类型和约束条件

              ORM属性类型: 1. CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该 ...

  3. INNODB 数据页结构

    InnoDB DataPage 16384B 16K 38B FILE HEADER 56B PAGE HEADER RECORD Infimum + supremum Records UserRec ...

  4. SSL F5

    应用交付领域经常提到SSL加速,但SSL加速到底是什么意思?SSL加速和F5指什么意思呢?在网上查询和整理了一些关于SSL加速和F5的相关解释,仅供参考:SSL加速:加密套接层协议(简称SSL)是网络 ...

  5. 一个导致JVM物理内存消耗大的Bug

    概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的.在查的过程中,阴差阳错地发现了JVM另外的一个Bug.这个B ...

  6. poj3680 最大权不相交路径

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8587   Accepted: 3662 Descrip ...

  7. java颜色对照表

  8. Python 绘制全球疫情地图

    国内疫情得到控制后,我就没怎么再关心过疫情,最近看到一条新闻,全球疫情累计确诊人数已经突破 500w 大关,看到这个数字我还是有点吃惊的. 思来想去,还是写一篇全球疫情的分析的文章,本文包括网络爬虫. ...

  9. go模板-代码生成器

    能用程序去做的事,就不要用手,编写自己的代码生成器就是用来解放你的双手,替你做一些重复性的工作. 上篇帖子写了模板的基础 go模板详说 ,有了基础就要做点什么东西,把所学到的东西应用起来才能更好的进步 ...

  10. elementUI中el-input输入数字且保留指定小数位

    <input type="text" placeholder="请输入保留一位小数的数字" class="user-input user-nam ...