注解+AOP实现全局登录认证效验(附代码)

自定义注解+AOP实现微服务全局登录认证 一、自定义注解的声明 声明的语法: @源注解 public @interface自定义注解的名字{ //注解的各种方法 } 二、自定义注解的各种源注解 什么是源注解:标记注解的注解 @Documented -表示该注解会被javadoc文档记录 @Target -表示设置当前注解的标记位置 可选值: ElementType.ANNOTATION_TYPE -表示当前注解可以标记其他的注解 ... 阅读详情

1. 需求分析

在登录后,前端每次向后端发起请求都需要携带下发的token,而后端的每个方法都需要效验token是否有效。当然可以提取出公共的方法,但是终归是与我们业务逻辑无关的代码,而且修改需要改动原来的业务代码,造成耦合
而通过注解+AOP就能很好的解耦合,提高扩展性

2. 什么是AOP

说到AOP第一个想到的肯定是面向切面编程。在传统的面向对象编程(OOP)中,横切关注点如日志、事务管理、安全性等通常会散布在多个模块中,这会导致代码的重复和混乱。AOP的目的是通过将这样的关注点从业务逻辑中分离出来,使得它们可以在一个集中的地方被管理和维护。主要分为如下三部分

  1. 切入点 - 实际增强的方法
  2. 增强 - 需要实现的增强逻辑代码
  3. 切面 - 是一个操作,指把增强使用到切入点的过程

3. 实现

在项目的公共模块common-util中创建如下,也可以根据自己项目架构选择

3.1 新建注解 @DaiJiaLogin

//方法前校验是否登录
@Target(ElementType.METHOD) //在方法上生效
@Retention(RetentionPolicy.RUNTIME) //运行时
public @interface DaiJiaLogin {
}

3.2 新建切面类

@Component
@Aspect //切面类
public class DaiJiaAspect {
    
}

3.3 在切面类中定义增强方法

注意增强方法上标注的是环绕,格式固定,根据自己的项目架构来修改

“execution(* com.charles.daijia..controller..*(…)) *代表任意的权限修饰符 在com.charles.daijia包名下的controller下的任意类里面任意方法,方法能有任意参数(…)
&&
@annotation(daiJiaLogin)” 同时必需要有这个注解才增强方法

@Resource
private RedisTemplate redisTemplate;

@Around("execution(* com.charles.daijia.*.controller.*.*(..)) && @annotation(daiJiaLogin)")
public void process(ProceedingJoinPoint proceedingJoinPoint, DaiJiaLogin daiJiaLogin) throws Throwable {
    //获取请求
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes;
    HttpServletRequest request = servletRequestAttributes.getRequest();

    //请求中得到请求头的token
    String token = request.getHeader("token");

    if(token == null)
        throw new DaiJiaException(ResultCodeEnum.LOGIN_AUTH);

    //在redis中查找是否存在token
    String id = (String) redisTemplate.opsForValue().get(RedisConstant.USER_LOGIN_KEY_PREFIX + token);

    if(id == null)
        throw new DaiJiaException(ResultCodeEnum.LOGIN_AUTH);

    //放入localstorage中
    AuthContextHolder.setUserId(Long.parseLong(id));

    proceedingJoinPoint.proceed();
}

3.4 使用

只需要在响应的方法上标注@DaiJiaLogin 这个注解就能实现我们需求的功能,而不需改动原有的业务代码

//获取登录用户信息
@Operation(summary = "登录后拉取用户信息")
@DaiJiaLogin  // 切面增强实现效验登录是否过期
@GetMapping("/getCustomerLoginInfo")
public Result<CustomerLoginVo> getCustomerLoginInfo(){
    //直接从threadLocal中获取
    Long userId = AuthContextHolder.getUserId();

    return Result.ok(customerService.getCustomerLoginInfo(userId));
}
AOP自定义注解保存到MongoDB数据库 /当前模块描述//请求方法aop:面向切面编程。将于业务无关,却对多个对象产生影响的的公共行为和逻辑。常用来保存系统日志。//根据你的包来//根据你的包来//这个是我的工具类,解析请求里的token拿userId的@Aspect@Component@Autowired@Autowired//切点表达式 拿执行方法的相关参数//拿方法上的注解//注解上的value//当前操作时间//执行方法//结束时间//耗时。 阅读详情

相关推荐

SpringSecurity中的@PreAuthorize注解具体介绍与使用

指定用户认证的规则、设置用户的身份验证方式,例如基于内存、数据库、LDAP 等方式,并定义用户的角色和权限。

欢迎来到 ABin-阿斌的博客:写一生代码,创一世佳话,筑一览芳华。 2930

使用AOP实现高效的登录校验:Java自定义切面实践

GuiguLogin为了使切面能够在指定的方法上生效,我们需要创建一个自定义注解。// 自定义注解,用于标记需要登录验证的方法一旦在方法上添加了该注解,切面就会在方法执行前自动进行登录验证。通过AOP技术,我们可以优雅地实现登录校验,并将验证逻辑从繁琐的业务代码中解耦。这不仅提升了代码的可读性和维护性,还增强了系统的模块化和可扩展性。

Takumilove的博客 891

Spring Boot自定义注解+参数解析器,构建灵活的安全认证机制

通过Spring AOP 实现权限认证,是构建安全Java应用的一种高效方式。Spring AOP允许开发者在方法执行的前、后或抛出异常时,自动执行特定的逻辑,而无需修改原有的业务代码。在权限认证的场景下,开发者可以利用AOP的拦截机制,在方法执行前检查用户是否具备相应的权限。本篇文章将通过AOP + 自定义注解实现权限的认证,自定义参数解析器便捷的获取当前登录人的信息。AOP拦截需要权限校验的方法。拦截器(Interceptor)拦截请求解析token,最后将其保存到当前的上下文中。

wjianwei666的专栏 619

AOP 实现全局异常处理

第一种: 1. 我们将采用Spring AOP统一处理异常,统一返回后端接口的结果。 2. 使用一个自定义异常和一个错误前端提示枚举来逐层传递消息 3. 一个错误枚举来代替新建异常信息类,减少业务异常信息文件的数量 //正常返回的枚举 SUCCESS(true, 2000,"正常返回", "操作成功"), // 系统错误,50开头 SY...

u013764330的博客 8683

nRF52840 低功耗蓝牙开发指南:从硬件架构到物联网应用实战

本文深入解析nRF52840低功耗蓝牙芯片的硬件架构与开发实践,涵盖从开发环境搭建到BLE协议栈开发的详细指南。通过实战案例分享低功耗优化技巧,帮助开发者高效实现物联网应用,特别适合智能家居和工业场景。

d3e4f的博客 415

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7112

SpringBoot学习笔记之AOP全局统一日志管理

我们开发的 Web 系统都会有日志模块,用来记录对数据有进行变更的操作。一般都会记录请求的 URL,请求的 IP,执行的方法,操作人员等等。其目的可能是为了保留操作痕迹,防抵赖,或是记录系统运行情况,再有就是审计要求。抛开杂念,静下心来,只看当下;充电片刻,日积月累,步步向前。

蜗牛老师,专注编程领域 5669

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何使用Python爬虫快速抓取东方财富网的股票数据,包括环境配置、API分析、核心代码实现及优化技巧。通过简单的requests和pandas库,5分钟内即可获取高质量股票数据,适合量化交易和数据分析初学者。

weixin_29040367的博客 1182

使用自定义注解和AOP解决登录校验问题

在不改变源代码或者很少改变源代码的情况下,增强类的某些方法。在业务代码之前设置 切入点创建切面类,也就是比如登录校验的某些公共方法切面类从切入点切入流程,形成切面。

云想衣裳花想容,春风拂槛露华浓 435

VOS3000线路对接、路由配置与路由分析操作教程

通过本教程,你应该已经掌握了VOS3000的线路对接、路由配置和路由分析的基本操作。添加备用路由:为常用前缀添加备用路由,确保在主路由失效时呼叫仍能正常进行。进入线路管理:点击“系统管理” -> “线路管理” -> “添加线路”。查看日志:在“系统日志”中查看路由选择情况,确保路由配置正确。失败原因:查看失败呼叫的原因(如“无应答”、“线路忙”等)。线路选择:选择之前添加的线路(如“供应商A”)。保存并启用:填写完毕后,点击“保存”并启用路由。路由名称:自定义一个名称(如“路由A”)。

AI_wx_3307623172的博客 2970

雪球股票数据接口

周期(day-日,week-周,…表示获取前8个周期(日)数据):类型(before-历史)表示深圳证券交易所,表示上海证券交易所):开始时间戳(一定要。

qq_31856061的博客 6807

(二)AOP参数校验与注册、登录

因为VerifyParam是一个参数的校验,不是方法,而pointcut注解是拦截方法的,对于 VerifyParam注解的操作是放在validateParams 方法中的。checkcode是图形校验码,emailcode是邮箱验证码,存到数据库的是emailcode,注册这一部分没有特别难以理解的,要特别注意邮箱验证码是有时效的,前端没有写,时间是15分钟,邮箱验证码是通过与数据库内存储的做的对比,这也是前面为什么会存储到数据库中,这个做法可以记录一下,不放在redis中,而是放到MySQL数据库中。

qq_43544934的博客 855

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1903

SpringBoot 使用 Sa-Token 完成注解鉴权功能

注解鉴权 —— 优雅的将鉴权与业务代码分离。本篇我们将介绍在 Sa-Token 中如何通过注解完成权限校验。Sa-Token 是一个轻量级 java 权限认证框架,主要解决登录认证、权限认证、单点登录、OAuth2、微服务网关鉴权 等一系列权限相关问题。

shengzhang_的博客 3655

43、基于机器学习的GNSS信号质量监测方法

本文提出了一种基于支持向量机(SVM)的GNSS信号质量监测方法,旨在有效检测邪恶波形(EWF)威胁并抑制多径干扰对导航精度的影响。通过构建包含现场采集与合成数据的数据集,结合11个相关器测量值、链路预算、仰角和方位角等特征,采用RBF核函数的SVM模型进行分类。研究评估了不同平滑时间窗口对漏检率和误报率的影响,结果表明在约35-40秒平滑时间下性能趋于稳定,并可通过多数投票机制进一步优化检测性能。该方案适用于星载GNSS接收器,在计算资源受限条件下实现了高可靠性与低完整性风险的平衡。

yyy34的博客 188

自动驾驶感知新方案:YOLOv13多模态(RGB+LiDAR+热成像)融合实战

YOLOv13的RGB+LiDAR+热成像多模态融合方案,解决了自动驾驶感知的鲁棒性问题,通过跨模态特征互补和注意力融合,实现了复杂场景下的高精度检测。本文从架构设计、数据预处理、核心模块实现到车载部署,完成了全流程实战。动态模态权重:根据场景自动调整各模态的权重(如黑夜场景提升热成像权重);端到端3D检测:直接从原始点云与图像进行3D检测,减少预处理步骤;轻量化优化:针对车载设备进一步剪枝量化,提升推理速度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 533

【自定义注解+AOP实现登录校验+全局异常处理返回友好提示】

*** 校验登录的注解/*** 登录拦截切面/*** 校验token的工具类try {// 1. 从header里面获取token HttpServletRequest request = getHttpServletRequest();// 2. 校验token是否合法&是否过期;如果不合法或已过期直接抛异常;如果合法放行 Boolean isValid = jwtOperator . validateToken(token);if(!isValid) {

isymikasan的博客 2380

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

微服务开发中,使用AOP和自定义注解实现对权限的校验

权限开关用户ID,需读取注解所在方法的入参值角色列表,限定方法访问所需的角色列表,这里默认是教师-teacher,就是说登录用户的角色必须含有教师角色。/*** 权限限制./*** 权限校验(默认true)/*** 入参-用户ID* @return/*** 角色列表(默认teacher-教师)* @return/*** 权限限制./*** 权限校验(默认true)/*** 入参-用户ID* @return/**

天草二十六 1170

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JWT+AOP+自定义注解实现接口安全

前言: 又是一个人加班无聊的时间,把之前尝试的一个例子大概做一个总结,这是一个使用json  web token实现的校验接口安全的例子。具体是方式是,后台使用jwt,用户登录后,服务端返回jwttoken,前端做cookie存储,同时将jwttoken和对应的userId放在每一个请求的header上,这里要做跨域处理。通过自定义的注解实现校验,校验结果以异常的形式抛出,定义全局的异常处理处理上...

koyi0000的博客 2316

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

aop实现权限及流程讲解(优化)

深入理解aop权限

weixin_47729434的博客 2604

【AOP系列】后端登录这样写才香

【AOP系列】之后端登录这样写才香 文章目录【AOP系列】之后端登录这样写才香那么一个好的登录到底应该怎么写呢?依赖工具类登录注解开发**@CheckLogin**@IgnoreLogin注解的实现注解的使用token的校验Service层获取UserId全局拿用户信息 在日常开发过程中,基本很多接口都会通过token的方式来检测当前用户的登录状态。 只有登录过的用户才能正常访问接口。 一方面可以...

大火yzs 664

2021-04-21-自定义注解+aop实际应用

元注解 注解定义方法 SpringBoot整合自定义注解 AOP统一身份认证

qq_41270550的博客 398

SpringBoot小项目——简单的小区物业后台管理系统 & 认证鉴权 用户-角色模型 & AOP切面日志 & 全局异常【源码】

基于SpringBoot的简单的小区物业后台管理系统,主要功能有报修的处理,楼宇信息和房屋信息的管理,业主信息的管理【核心】,以及数据统计分析模块Echarts绘图;此外采用用户-角色权限模型,结合自定义注解实现简单的权限管理功能,采用aop切面实现日志的存储,全局异常的使用。

Arya的博客,专注后端领域 669

微服务登录

微服务的登录事件你要考虑到一个问题,就是在不是微服务架构的时候密码都是放在session里面的,但是到了微服务架构如果还是放在session里面每个微服务保持的又是无状态协议,所以微服务不知道你的密码,但是我们可以把密码放在浏览器的cookie里为了防止黑客窃取在加上电脑的ip,在做项目的时候要考虑到一个问题,就是如果用户登录了可以访问页面的一些功能但是用户没有登录在他实现功能则要强制他返回登录访问到登页面。这个时候其实就是在做城市列表环绕增强,假如用户没有登录访问城市列表,这个时候我们可以自定义一个注解在

qq_44949002的博客 698

AOP实现RBAC权限验证

首先引入AOP的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> TokenUtil工具类 作用:1.通过用户生成token ...

博客 570
上一篇: centos虚拟机restart网络后隔一会断联
下一篇: [已解决] com.qcloud.cos.exception.CosServiceException: Access Denied. (Status Code: 403) 腾讯云创建bucket时报
美味不是堡
博客等级 码龄6年 2009粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值