想要在一些方法执行之前要进行一个逻辑判断,
本来想使用拦截器来进行拦截但是后来还是说声算了.
想到使用AOP的前置增强和自定义异常和自定义异常捕获可以解决这个问题,
一次性用了这么多,就是想把之前比较模糊的东西重新拿起来
1.我们先自定义一个注解
/** * @program: shiro-demo * @description: 自定义注解 * @author: @DogElder * @create: 2020-04-18 20:42 **/ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnnotation { }
2.自定义一个异常类
我们首先要先导入AOP依赖
1 <!--aop--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-aop</artifactId> 5 </dependency>
import lombok.Data; /** * @program: shiro-demo * @description: 自定义异常类 * @author: @DogElder * @create: 2020-04-18 21:11 * 要继承RuntimeException **/ @Data public class TestExcption extends RuntimeException { private String code; private String message; // 这个地方需要写一个有参构造 public TestExcption(String code, String message) { this.code = code; this.message = message; } }
异常捕获
/** * @program: shiro-demo * @description: 异常处理 * @author: @DogElder * @create: 2020-04-18 21:20 **/ @RestControllerAdvice public class TestExceptionHandler { /** * @Description: 异常捕获 * @Param: java.util.Map<java.lang.String,java.lang.Object> * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author:@Dog_Elder * @Date: 2020/4/18 */ @ExceptionHandler(TestExcption.class) public Map<String, Object> handleCustomException(TestExcption customException) { Map<String, Object> error = new HashMap<>(); error.put("code", customException.getCode()); error.put("message", customException.getMessage()); return error; } }
3.然后我们自定义一个切面类
/** * @program: shiro-demo * @description: 自定义切面 * @author: @DogElder * @create: 2020-04-18 20:49 **/ @Configuration @Aspect public class TestAop { /** * @Description: 声明一个切入点 * @Param: void * @return: void * @Author:@Dog_Elder * @Date: 2020/4/18 * @Pointcut 声明一个切入点 参数为切点表达式 * 注意: 这里的切入点是@annotation注解类的全路名 (看你们声明的切入点是在那里进行更换) */ @Pointcut("@annotation(com.shiro.shiro_demo.config.annotation.TestAnnotation)") public void testPointCut() { } /** * @Description: 声明一个前置增强 * @Param: void * @return: void * @Author:@Dog_Elder * @Date: 2020/4/18 * @Before 前置增强 参数为切点方法 * 注意:抛异常 抛异常 抛异常 throws RuntimeException 和 throw * */ @Before("testPointCut()") public void testBefore() throws RuntimeException{ // 这里可以实现你的逻辑代码 (因为是demo) // 我就写一个简单的小例子 int n=1; if (n!=0) { //这个地方就是我们写的自定义的异常 throw new TestExcption("401","无权限"); } } }
测试
END