资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

SpringBoot - AOP 实现登录状态检查

Java 更新时间: 发布时间: 计算机考试归档 最新发布

SpringBoot - AOP 实现登录状态检查

目录
  • 前言
    • 实现登录状态检查的方式
    • AOP 定义
    • AOP 相关概念
    • Advice 通知类型
  • 具体实现
    • 实现代码
    • 测试
    • 源码

前言

记录下AOP实现登录状态的检查,文章使用的JWT校验参考:SpringBoot - 集成Auth0 JWT


实现登录状态检查的方式
  • Servlet过滤器
  • 拦截器
  • Spring AOP

AOP 定义

AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术,在程序开发中主要用来解决一些系统层面上的问题,在不改变原有的逻辑的基础上,增加一些额外的功能,如日志,事务,权限等


AOP 相关概念
术语概念描述
Aspect切面通常是一个类,可以定义切入点和通知
Joint point连接点程序执行过程中明确的点,在Spring中指的是被拦截到的方法(Spring只支持方法类型的连接点)
Advice通知AOP在特定的切入点上执行的增强处理,有before(前置),after(后置),afterReturning(最终),afterThrowing(异常),around(环绕)
Pointcut切入点带有通知的连接点,在程序中主要体现为书写切入点表达式
Target目标对象织入 Advice 的目标对象
Weaving织入将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

Advice 通知类型
类型描述
Before在目标方法被调用之前做增强处理
After在目标方法完成之后做增强
AfterReturning在目标方法正常完成后做增强
AfterThrowing处理程序中未处理的异常
Around环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型

具体实现 实现代码
  • 自定义注解CheckLogin
public @interface CheckLogin {
}
  • 切面CheckLoginAspect
import com.coisini.aop.util.JwtUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;


@Aspect
@Component
public class CheckLoginAspect {

    
    @Around("@annotation(com.coisini.aop.auth.annotation.CheckLogin)")
    public Object checkLogin(ProceedingJoinPoint point) {
        try {
            // 从header中获取token
            RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
            ServletRequestAttributes attributes = (ServletRequestAttributes) requestAttributes;
            HttpServletRequest request = attributes.getRequest();

            String token = request.getHeader("token");

            // 校验token是否合法
            Boolean valid = JwtUtil.verifyToken(token);
            if (!valid) {
                throw new ServerErrorException(HttpStatus.UNAUTHORIZED.value(), "Token 不合法");
            }

            // 执行后续的方法
            return point.proceed();
        } catch (Throwable throwable) {
            throw new ServerErrorException(HttpStatus.UNAUTHORIZED.value(), "Token 不合法");
        }
    }
}
  • 自定义异常ServerErrorException
import lombok.AllArgsConstructor;
import lombok.Data;


@Data
@AllArgsConstructor
public class ServerErrorException extends RuntimeException{

    public Integer code;
    public String message;

}
  • 统一异常处理GlobalExceptionAdvice
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@RestControllerAdvice
@Slf4j
public class GlobalExceptionAdvice {

    @ExceptionHandler(ServerErrorException.class)
    public ResponseEntity handleServerErrorException(ServerErrorException e) {

        log.warn("ServerErrorException 异常", e);

        return new ResponseEntity<>(
                UnifyMessage.builder()
                        .code(e.getCode())
                        .message(e.getMessage())
                        .build(),
                HttpStatus.UNAUTHORIZED
        );
    }

}
  • 统一消息返回UnifyMessage
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UnifyMessage {

    private int code;
    private String message;

}

测试
  • 测试方法TestController
@CheckLogin
@GetMapping(value = "/test")
public String testCheckLogin() {
    // TODO 业务
    return "Token验证通过";
}
  • 获取Token


  • 无Token测试


  • 传递Token



源码

GitHub:https://github.com/maggieq8324/java-learn-demo/tree/master/springboot-aop


- End -
白嫖有风险
点赞加收藏
转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/324945.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【SpringBoot - AOP 实现登录状态检查】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2