springboot自定义注解实现token认证功能

引入aop的依赖

  <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-aopartifactId>
  dependency>
1.自定注解CheckLogin
/**
 * 检查是否登录
 * @author :  blue
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckLogin {
}
2.编写注解的切面类
/**
 *  

登录切面

* * @description : 检查是否有登录凭证,如果有则检查凭证是否正确,如果不有则抛出异常。 * @author : blue */
@Aspect @Component @RequiredArgsConstructor public class CheckLoginAspect { private final RedisCacheUtil redisCacheUtil; /** * 设置操作日志切入点 在注解的位置切入代码 */ @Pointcut("@annotation(checkLogin)") public void pointcut(CheckLogin checkLogin) { } //前置通知 @Before("pointcut(checkLogin)") public void beforeMethod(JoinPoint joinPoint,CheckLogin checkLogin) { // 获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); // 从获取RequestAttributes中获取HttpServletRequest的信息 assert requestAttributes != null; HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_REQUEST); if (request == null){ throw new BusinessException("非法访问!"); } String token = request.getHeader("Authorization"); if (StringUtils.isBlank(token)) { throw new BusinessException("请先登录!"); } //判断redis中的token是否过期 Object obj = redisCacheUtil.getCacheObject(RedisCacheUtil.RedisConstants.Authorization_TOKEN + token); if (obj == null){ throw new BusinessException("请先登录!"); } } }
3.在方法上添加@CheckLogin
  	@RequestMapping(value = "test",method = RequestMethod.GET)
    @CheckLogin
    public String test(){
       return "welcome to test";
    }
4.测试

1.首先不携带token访问,可以看到返回了401错误

springboot自定义注解实现token认证功能_第1张图片
2. 携带token访问,可以看到访问成功

springboot自定义注解实现token认证功能_第2张图片

你可能感兴趣的:(spring,boot,spring,boot,java,后端)