首页 > 其他分享 >使用aop去实现token校验

使用aop去实现token校验

时间:2023-10-25 16:26:13浏览次数:32  
标签:lang 通知 aop 校验 token import org

1. 前言

昨天去面试,被问懵的一个面试题,面试官看了一下简历,轻笑了一声原来你是用拦截器做的token校验啊,那么改用aop你怎么去做校验。我当时脑袋一篇空白。下面就写个小demo

2. aop通知

先回顾一下aop的通知,aop通知有五种分别如下

  • 前置通知:方法执行前通知
  • 后置通知:方法执行后通知
  • 环绕通知:方法执行中通知
  • 异常抛出通知:方法抛出异常
  • 引介通知:类中增加新的方法属性

我们需要校验用户进行拦截oken,那么在执行到这个方法的时候拦截到,就需要用到环绕通知

3. 导入Maven依赖

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

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

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.21</version>
        </dependency>

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

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

4. 实际代码

AOP拦截类

package com.yefeng.utils;

/**
 * @author 叶枫
 * @version 1.0.0
 * @create 2023/10/25 15:23
 */
import cn.hutool.jwt.JWTUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
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.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;

/**
 * 使用aop进行token校验
 * @author yefeng
 */
@Aspect
@Component
@Slf4j
public class TokenVerificationAop {
    /**
     * 登录路径 ->放行
     */
    private static final String LOGIN = "login";

    /**
     * @Pointcut 声明切入点表达式。
     * 注意此处扫描的是你的Controller层接口位置
     */
    @Pointcut("execution(public * com.yefeng.controller..*..*(..))")
    public void pointcut() {
    }

    /**
     * @Around 环绕通知
     * @Around("pointcut()") 可以理解为对这个方法进行环绕通知
     * ProceedingJoinPoint 参数 用于环绕通知,
     * 使用proceed()方法来执行目标方法,可以理解为 前置通知结束 开始执行使用该注解的方法。
     */
    @Around("pointcut()")
    public Object doBefore(ProceedingJoinPoint joinPoint) throws Throwable {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert attributes != null;
        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader("Authorization");
        if (request.getRequestURI().contains(LOGIN)) {
            return joinPoint.proceed();
        }
        if (StringUtils.isNotBlank(token)) {
            try {
                JWTUtil.parseToken(token);
            } catch (Exception e) {
                // 解析jwt令牌出错, 说明令牌过期或者伪造等不合法情况出现 401
                log.info("AuthorizeFilter  解析jwt令牌出错", e);
                //此处可以返回自定义 Result结果对象 转成Json格式
                throw new Exception("解析jwt令牌出错");
            }
        } else {
            log.info("AuthorizeFilter  登录令牌不存在");
            throw new Exception("登录令牌不存在");
        }
        //执行业务逻辑,放行
        return joinPoint.proceed();
    }
}

标签:lang,通知,aop,校验,token,import,org
From: https://www.cnblogs.com/lymf/p/17787475.html

相关文章

  • Modbus协议详解4:RTU帧 & ASCII帧的差错校验
    前面已经分析过RTU帧和ASCII帧的报文区别,细心的朋友应该会发现在两种不同的报文传输模式下都有一个共同的组成部分——差错校验。这个差错校验在RTU模式和ASCII模式下也不是不相同的。看下面的对比:RTU模式的差错校验:ASCII模式的差错校验:总而言之,RTU模式下用的是CRC校验,ASCII模式下......
  • JWT 生成token
    创建一个springboot项目导包<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>创建一个jwt工具类importio.jsonwebtoken.Claims;import......
  • 软件测试|如何在GitHub生成个人token?
    简介在GitHub上生成个人访问令牌(PersonalAccessToken)是一种安全的方式,用于进行API请求、访问私有仓库、或者执行其他需要身份验证的操作。本文将详细介绍如何在GitHub上生成个人访问令牌。步骤1:登录GitHub帐户如果还未注册GitHub账户,需要先注册一个GitHub账户,这里我们不......
  • 校验 ChatGPT4 真实性的三个经典问题:快速区分 GPT3.5 与 GPT4,并提供免费测试网站
    现在已经有很多ChatGPT的套壳网站,以下分享验明GPT-4真身的三个经典问题,帮助你快速区分套壳网站背后到底用的是GPT-3.5还是GPT-4。大家可以在这个网站测试:https://ai.hxkj.vip,免登录可以问三条,登录之后无限制。咱们使用免登录的额度测试就已经够用了测试问题1:Whatist......
  • URPF---源地址校验
    uRPF技术:单播逆向路径转发(UnicastReversePathForwarding),其主要功能是防止基于源地址欺骗的网络攻击行为。在没有配置uRPF技术时,网络设备不检查数据包的源地址,只关心能不能到达目的地址。由此,产生了虚假源地址欺骗网络攻击行为,例如基于源地址欺骗的DOS攻击和DDOS攻击......
  • JWT Tool:针对 JSON Web Tokens 的测试工具题解JWT cracking
    什么是JWT?JWT是JSONWebToken的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。JWT由三部分......
  • 使用aop(肉夹馍)为BlazorServer实现统一异常处理
    背景用户做一个操作往往对应一个方法的执行,而方法内部会调用别的方法,内部可能又会调用别的方法,从而形成一个调用链。我们一般是在最顶层的方法去加try,而不是调用链的每一层都去加try。在web开发中,用户的一个操作通常对应一个http请求,常见的mvc中一个controller的action会来执行......
  • kubernetes获取永久token
    kubernetes获取永久token概述1.22版本之前都是自动创建sa的token,1.22及之后版本永久token需要使用kubernetes.io/service-account-token类型创建secret步骤服务账号令牌Secret类型为kubernetes.io/service-account-token的Secret用来存放标识某服务账号的令牌凭据。说......
  • 在Delphi中使用正则表达式校验中文姓名
    usessystem.RegularExpressions;functionIsChineseName(constaName:string;constaMaxLength:Integer=10):Boolean;beginvarPattern:='^[\x{4E00}-\x{9FA5}]{2,'+aMaxLength.ToString+'}(·[\x{4E00}-\x{9FA5}]{2,'+aMaxLength.ToString......
  • 前端token获取存储
    //存储的token的KEYexportconstTOKEN_KEY='token-user';//获取token接口urlexportconstTOKEN_URL='';//跳转登录地址exportconstLOGIN_URL='';//获取tokenexportfunctiongetToken(){consttoken=localStorage.getItem(TOKEN_......