guava 整合springboot 自定义注解实现接口鉴权调用保护

news2025/1/11 5:42:47

文章目录

  • 一、简要概述
  • 二、实现过程
    • 1. pom引入依赖
    • 2. 自定义注解
    • 3. 定义切面
    • 4. 定义权限检查逻辑
  • 三、注解使用
  • 四、运行结果
  • 五、源码放送

一、简要概述

Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和springboot的自定义注解、切面等技术来打造最简单的接口鉴权系统。

二、实现过程

1. pom引入依赖

在原有springboot基础上引入切面、guava依赖

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>32.1.2-jre</version>
		</dependency>

2. 自定义注解


import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AuthToken
{
    
}

3. 定义切面

在aop的逻辑内,先走@Around注解的方法。然后是@Before注解的方法,然后这两个都通过了,走核心代码,核心代码走完,无论核心有没有返回值,都会走@After方法。然后如果程序无异常,正常返回就走@AfterReturn,有异常就走@AfterThrowing。

在这里插入图片描述
在这里插入图片描述

我们这里使用了 @Before:前置通知,在调用目标方法之前执行检查


import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.fly.core.exception.ValidateException;
import com.fly.core.utils.HttpServletUtils;
import com.fly.demo.aspect.annotation.AuthToken;
import com.fly.demo.service.TokenService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Aspect
@Order(0)
@Component
public class AuthTokenAspect
{
    @Autowired
    TokenService tokenService;
    
    /**
     * 使用AuthToken注解标注的类
     * 
     */
    @Before("@annotation(authToken)")
    public void doBefore(JoinPoint joinPoint, AuthToken authToken)
    {
        HttpServletRequest request = HttpServletUtils.getRequest();
        if (request == null)
        {
            log.error("AuthToken注解使用错误,当前请求非web请求");
        }
        log.info("开始执行鉴权检查");
        String token = request.getHeader("token");
        if (!tokenService.valide(token))
        {
            throw new ValidateException("对不起,您无权访问该接口,请检查token参数");
        }
    }
}

4. 定义权限检查逻辑


import java.util.UUID;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class TokenService
{
    /**
     * 30分钟失效
     */
    Cache<String, String> cache = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.MINUTES).build();
    
    /**
     * 验证token是否合法
     * 
     * @param token
     */
    public boolean valide(String token)
    {
        return StringUtils.equals(token, getToken());
    }
    
    /**
     * 获取sysToken
     */
    private String getToken()
    {
        String sysToken = cache.getIfPresent("token");
        if (sysToken == null)
        {
            sysToken = UUID.randomUUID().toString().replace("-", "");
            log.info("------ now valid sysToken is: {}", sysToken);
            cache.put("token", sysToken);
        }
        return sysToken;
    }
}

三、注解使用

我们在需要执行权限检查的地方添加@AuthToken即可

    @AuthToken
    @ApiOperation("刷新欢迎语")
    @PostMapping("/refresh")
    @ApiImplicitParam(name = "message", value = "欢迎语", allowableValues = "骝马新跨白玉鞍,战罢沙场月色寒。城头铁鼓声犹震,匣里金刀血未干。,活捉洪真英,生擒李知恩! ", required = true)
    public JsonResult<?> refresh(@RequestHeader String token, String message)
    {
        if (StringUtils.isBlank(message))
        {
            return JsonResult.error("message不能为空");
        }
        boolean success = updateWelcomeMsg(message) > 0;
        return success ? JsonResult.success(message) : JsonResult.error("刷新欢迎语失败");
    }

四、运行结果

token不合法提示
在这里插入图片描述
后台查看token
在这里插入图片描述
请求头填入合法token
在这里插入图片描述
接口调用成功
在这里插入图片描述

五、源码放送

https://gitcode.com/00fly/springboot-demo/overview


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis实战篇(二:商户查询缓存)

目录 三、商户查询缓存 1.缓存介绍 2.添加商户缓存 &#xff08;1&#xff09;缓存模型和思路 &#xff08;2&#xff09;代码实现 3.店铺类型缓存 4.缓存更新策略 5.实现商铺缓存与数据库双写一致 6.缓存穿透 &#xff08;1&#xff09;介绍 &#xff08;2&#x…

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中&#xff0c;确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中&#xff0c;我们将深入研究etcd&#xff0c;这是一个开源的分布式键值存储。我们将探索其基本概念、特…

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI主要功能 2 快速开始2.1 版本说明2.2 配置文件2.3 pom依赖2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目&#xff0c;是Spring专门面向于AI的…

【网络篇】TCP知识

TCP首部格式&#xff1f; 为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f; IP 层是不可靠的&#xff0c;它不保证网络包的交付、不保证网络包的按序交付也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性&#xff0c;那么就需要由上层&#xff0…

【Liunx篇】基础开发工具 - yum

文章目录 &#x1f335;一.Liunx下安装软件的方案&#x1f43e;1.源代码安装&#x1f43e;2.rpm包安装&#x1f43e;3.包管理器进行安装 &#x1f335;二.软件包管理器-yum&#x1f335;三.yum的具体操作&#x1f43e;1.查看软件包&#x1f43e;2.安装软件包&#x1f43e;3.卸载…

Co-Slam论文及复现记录

Overview 输入RGB-D流&#xff1a; { I t } t 1 N { D t } t 1 N \{I_t\}^{N}_{t1}\{D_t\}^{N}_{t1} {It​}t1N​{Dt​}t1N​&#xff0c;它们带有已知相机内参 K ∈ R 3 3 K\in \mathbb{R}^{3\times 3} K∈R33。通过联合优化相机姿态 { ξ t } t 1 N \{\xi_t\}^{N}_{t1} {…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果&#xff08;以猫为例&#xff09; JavaScript 实现 Scratc…

解决view-ui-plus 中表单验证不通过问题,select 组件开启multiple模式 总是提示错误,即使不验证也提示,有值也验证失败

&#x1f609; 你好呀&#xff0c;我是爱编程的Sherry&#xff0c;很高兴在这里遇见你&#xff01;我是一名拥有十多年开发经验的前端工程师。这一路走来&#xff0c;面对困难时也曾感到迷茫&#xff0c;凭借不懈的努力和坚持&#xff0c;重新找到了前进的方向。我的人生格言是…

ARM V8 GIC中断模块

文章目录 1. 缩略语2. 简介2.1. 中断类型2.1.1 SGI软件中断2.1.2 PPI私有外设中断2.1.3 SPI 共享外设中断2.1.4 LPI(locality-specific peripheral interrupts) 2.2. GIC 架构2.2.1 Distributor2.2.2 Redistributor2.2.3 CPU Interfaces 2.3. 属性层次&#xff08;affinity&…

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献&#xff1a; perl安装教程

算法日记(2024.12.09)

1.二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 …

《操作系统 - 清华大学》6 -5:局部页面置换算法:最不常用置换算法 (LFU, Least Frequently Used)

文章目录 1. 最不常用算法的工作原理2.最不常用算法特征3. 示例 1. 最不常用算法的工作原理 最不常用算法&#xff1a;注意并不是表示算法本身不常用&#xff0c;而是采取最不常使用页面的策略&#xff0c;Least Frequently Used&#xff0c; LFU。LRU 是最久未被访问的页&…

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…

OpenAI12天 –第3天的实时更新,包括 ChatGPT、Sora、o1 等

OpenAI提前开启了假期&#xff0c;推出了为期 12 天的活动&#xff0c;名为“OpenAI 12 天”。在接下来的一周左右的每一天&#xff0c;OpenAI 都将发布现有产品的新更新以及新软件&#xff0c;包括备受期待的 Sora AI 视频生成器。 OpenAI 首席执行官 Sam Altman 表示&#x…

C#导出数据库到Excel文件(.NET)

随着企业业务的增长和复杂性的增加&#xff0c;对数据进行有效的分析、共享和报告变得至关重要&#xff1b;而Excel&#xff0c;作为一款广泛接受的数据处理工具&#xff0c;提供了强大的计算能力、可视化选项以及与多种数据分析工具的兼容性&#xff0c;使得它成为从数据库导出…

基于Java后台实现百度米制坐标转WGS84地理坐标实战

目录 前言 一、需求简介 1、信息查询 二、Java后台转换 1、相关属性 2、相关转换方法 3、实例转换 三、Leaflet可视化 1、准备展示数据 2、Marker标记 3、可视化效果 四、总结 前言 在现代信息技术高速发展的今天&#xff0c;地理信息系统&#xff08;GIS&#xff0…

声音克隆GPT-SoVITS

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS&#xff0c;作为一款结合了GPT&#xff08;生成预训练模型&#xff09;和SoVITS&#xff08;基于变分信息瓶颈技术的歌声转换&#xff09;的创新工具&#xff0c;正在声音克隆领域掀…

自动驾驶数据集的应用与思考

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;是互联网时代的“石油”“煤炭”&#xff0c;掌握数据对于企业而言是能够持续生存和发展的不竭动力&#xff0c;对于需要大量数据训练自动驾驶系统的企业而言更是如此。 而随着激光雷达、毫米波雷…

开源项目:轻型图像分割 unet_lite

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

贪心算法专题(四)

目录 1. 单调递增的数字 1.1 算法原理 1.2 算法代码 2. 坏了的计算器 2.1 算法原理 2.2 算法代码 3. 合并区间 3.1 算法原理 3.2 算法代码 4. 无重叠区间 4.1 算法原理 4.2 算法代码 5. 用最少数量的箭引爆气球 5.1 算法原理 ​5.2 算法代码 1. 单调递增的数字…