一:环境
- 创建个spring boot 2.1.2版本
- 有个能正常调用的接口
二:pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三:创建个注解类
package com.example.demo.config;
import java.lang.annotation.*;
/**
* @author huang(jy)
* @version 1.0
* @date 2020/5/8 14:39
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
//是否需要登录拦截
public @interface NeedLogin {
//是否需要登录拦截,默认不需要
boolean needLoginValue() default false;
}
四:创建切面类
package com.example.demo.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.BeanUtils;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* @author huang(jy)
* @version 1.0
* @date 2020/5/8 15:48
*/
@Aspect //AOP
@Component
@Order(-99) // 控制多个Aspect的执行顺序,越小越先执行
public class NeedLoginPermsAspect {
//指定注解的切入点
@Pointcut("@annotation(com.example.demo.config.NeedLogin)")
public void pointCut() {
}
//环绕通知,基于切入点方法
@Around("pointCut()")
public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
NeedLogin needLogin = (NeedLogin) signature.getMethod().getAnnotation(NeedLogin.class);
if (needLogin == null || !needLogin.needLoginValue()) {
return "没有权限";
}
Object[] args = joinPoint.getArgs();
//对原方法进行调用
Object result = joinPoint.proceed(args);
return result;
}
}
五:结果验证
1.添加注解(值为true),结果如下:
2.添加注解,使用默认值(false),结果如下:
3.无注解,结果如下:
总结:
1.创建注解类
2.创建切面类,启用注解@Aspect、@Component、@Order(-99);通过@Pointcut("@annotation(具体注解类路径)")指定注解切入点;最后通过环绕通知(@Around(“pointCut()”))实现拦截效果,在此方法里进行判断,最终通过joinPoint.proceed(args);调用原方法
如有转载请请务必保留此出处:https://blog.csdn.net/hometing218/article/details/106001011