springboot+自定义注解+AOP实现权限控制(一)
文末有下载链接!!!
通过自定义注解+AOP可以学习到:
1. 权限控制框架的底层的一些实现,以及权限控制的流程
2. 拦截器和AOP的区别
3. 通过自定义注解来学习spring注解的实现
一. 权限控制
在之前项目里的权限控制,一般会选择这几种方案:
1. shiro
2. spring security
3. JWT
4. 自定义拦截器
简单来说使用后的感觉,shiro是基于过滤器,spring security是基于spring框架及拦截器,JWT使用token比较方便及前后端调试,自定义拦截器对权限控制的流程熟悉要求比较高,需要考虑的if else比较多。下面通过AOP的方式来学习spring security底层的一些实现。
二. 拦截器和AOP的区别
1. 拦截器
Spring中拦截器有三个方法:preHandle,postHandle,afterCompletion,如public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o)表示被拦截的URL对应的方法执行前的自定义处理,可以看出它是基于url级别。
拦截器可以在方法执行之前(preHandle)和方法执行之后(afterCompletion)进行操作,回调操作(postHandle),可以获取执行的方法的名称,请求(HttpServletRequest),及参数名称,但无法获取参数的值。
2. AOP
只能拦截Spring管理Bean的访问。这是关键的一点。AOP操作可以对操作进行横向的拦截,最大的优势在于它可以获取执行方法的参数( ProceedingJoinPoint.getArgs() ),对方法进行统一的处理。
三. 自定义注解
首先查看一个spring自带的注解,比如@RequestMapping,如图
可以看出,注解可以分为三部分
1. 元注解
2. @interface标识为注解
3. 注解的属性值
1. 元注解
jdk自带的注解,用来注解其他注解。
1. @Target:
被描述的注解可以用在什么地方,如标识本注解可以使用在类上/方法上。取值(ElementType)有:
1.CONSTRUCTOR:用于描述构造
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类、接口(包括注解类型) 或enum声明2. @Retention
被描述的注解在什么范围内有效,如标识本注解在运行期间有效。取值(RetentionPoicy)有:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)3. @Documented
标记注解,表示注解可以被API文档化
4. @Inherited
标记注解,如果@Inherited修饰的注解用于一个class,则这个注解可被用于该class的子类。
2. @interface
@interface用来声明一个注解。格式:public @interface 注解名 {定义体}
3. 注解的属性值
定义体里,方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。如 :
String value() default "";
String[ ] value() default {};
在下文《springboot+自定义注解+AOP实现权限控制(二)》中,一起学习和使用自定义注解和AOP的流程!