案例一、角色校验

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

/**
* 角色校验注解
*/
@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. SourceTree 3.1.3 版本跳过bitbucket注册方法(亲测好用)

    1.首先下载并安装好git程序. 2.接着下载并执行SourceTreeSetup-3.1.3.exe,会进入登录或注册bitbucket的界面,我只是想用软件,并不想去注册账号.怎么办?请往下看. ...

  2. ASHRAE KAGGLE大能源预测(前三名方案总结+相关知识点讲解+python实现)

    @ 目录 1 概述 2 处理思想学习 2.1 移除异常值 2.2 缺失值 2.3 目标函数 2.4 特征工程 2.4.1 Savitzky-Golay filter 2.4.2 Bayesian ta ...

  3. django提供二进制流数据文件的下载

    基于djnago框架的二进制流数据传输(提供较大文件的下载) (1)数据源: 高质量图片.视频.音频.文件.数据库数据等.如果是数据库文件,需要先读取相应的数据,然后写入表格在传输到前端以供下载! ( ...

  4. 4.4 Go goto continue break

    4.4 Go goto continue break Go语言的goto语句可以无条件的跳转到指定的代码行执行. goto语句一般与条件语句结合,实现条件转义,跳出循环体等. Go程序不推荐使用got ...

  5. java新学者(二)

    一.构造方法的特点 创建新的对象 A a =new A (); 二.抽象类和抽象方法的特点是什么? .抽象类使用abstract修饰: .抽象类不能实例化,即不能使用new关键字来实例化对象: .含有 ...

  6. 疯狂VirtualBox实战讲学录 以及 virtualbox完全学习手册 之我见

    都是是很专业,并钻石得很深的内容,但,有些事情是交替进行着的深入,太专注于VIRTUAL BOX就必要要牺牲其它的东西.

  7. Storm-jdbc-2讲 高级API及Trident

    之前对Storm集成JDBC写了一个简单的demo,最近深度研究了下,代码如下 首先,先写一个抽象类,便于减少代码的重复性: import com.google.common.collect.List ...

  8. POJ2377

    题目链接:http://poj.org/problem?id=2377 解题思路: Prim算法. Warning ! 注意考虑重边 ! 其实就是求最大生成树,没什么好说的,就上面那个坑. AC代码: ...

  9. 实用算法系列之RT-Thread链表堆管理器

    [导读] 前文描述了栈的基本概念,本文来聊聊堆是怎么会事儿.RT-Thread 在社区广受欢迎,阅读了其内核代码,实现了堆的管理,代码设计很清晰,可读性很好.故一方面了解RT-Thread内核实现,一 ...

  10. URL特殊字符转义

    在URL中,某些特殊字符会被转义成其它项,为了使这些特殊字符能正确表达,需用%加该字符的ASCII码在URL中显示.