Spring Boot项目通过自定义注解+AOP实现登陆拦截器和增强

Spring Boot项目通过自定义注解+AOP实现登陆拦截器和增强

前言

在 Java 开发中,AOP(面向切面编程)是一种很重要的编程思想,它可以将业务逻辑和非业务逻辑分离,提高代码的可维护性和可扩展性。Spring 框架提供了对 AOP 的支持,我们可以使用 Spring AOP 来实现方法级别的拦截和增强。本文将介绍如何通过自定义注解+AOP实现登陆拦截器和增强。

在开始前我们用通俗的语言来了解下AOP里面的主要操作术语:

  1. AOP:面向切面编程
    通俗说法:不改变代码或者很少改变源代码的情况下,增强类里面某些方法。
  2. 切入点
    实际被增强的那些方法
  3. 增强(通知)
    实际增强的功能,比如增加登陆判断
    增强有5种类型

前置增强:org.springframework.aop.BeforeAdvice是前置增强顶层接口,因为Spring只支持方法的增强,其子接口MethodBeforeAdvice是目前可用的前置增强。表示在目标方法执行前实施增强。

后置增强:org.springframework.aop.AfterReturningAdvice是目前可用的后置增强,表示在目标方法执行后实施增强。

环绕增强:org.aopalliance.intercept.MethodInterceptor代表了环绕增强,表示在目标方法执行前后实施增强。直接使用了AOP联盟定义的接口。

异常抛出增强:org.springframework.aop.ThrowsAdvice代表了异常抛出增强,表示在目标方法抛出异常后实施增强。

引介增强:org.springframework.aop.IntroductionInterceptor代表引介增强,表示在目标类中添加一些新的方法和属性。

  1. 切面
    操作,把增强使用到切入点的过程

实现步骤

引入依赖

我们需要在项目中引入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

定义注解

我们需要定义一个注解,用于标记需要进行拦截和增强的方法。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Login {

}

实现切面类

我们需要实现一个切面类,用于对标记了 @Login 注解的方法进行拦截和增强。

@Slf4j
@Component
@Aspect
public class LoginAspect {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     *
     * @param joinPoint
     * @param guiguLogin
     * @return
     * @throws Throwable
     */
    @Around("execution(* com.example.demo.*.controller.*.*(..)) && @annotation(Login)")
    public Object process(ProceedingJoinPoint joinPoint, Login Login) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();
        String token = request.getHeader("token");

        if(!StringUtils.hasText(token)) {
            throw new LoginException(ResultCodeEnum.LOGIN_AUTH);
        }
        String userId = (String)redisTemplate.opsForValue().get(RedisConstant.USER_LOGIN_KEY_PREFIX+token);
        if(StringUtils.hasText(userId)) {
            AuthContextHolder.setUserId(Long.parseLong(userId));
        }
        return joinPoint.proceed();
    }

}

上述代码是用来模拟token登陆获取用户信息的业务。

  • @Aspect 注解表示该类是一个切面类。
  • @Around 注解表示使用环绕通知来进行方法拦截和增强。

使用注解

我们可以在需要进行拦截和增强的方法上添加 @Login 注解。

@Login
@GetMapping("/getCustomerLoginInfo")
public Result<CustomerLoginVo> getCustomerLoginInfo() {
		// .....
}

总结

通过自定义注解+AOP实现登陆拦截器和增强。这种实现方式不仅简单易用,而且可以有效地提高代码的可维护性和可扩展性,具有很高的实用性和稳定性。在实际开发中,我们可以根据业务需求定义不同的注解,来实现对不同类型的方法进行切面编程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值