SpringBoot中使用AOP切面编程实现登录拦截

使用AOP切面编程实现登录拦截

1. 首先实现一个登录注册功能

以下代码仅供参考

  • 控制层
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public Result register(@RequestBody UserDto userDto) {userService.addUser(userDto);return Result.success("注册成功");}@PostMapping("/login")public Result<UserLoginVo> login(@RequestBody UserDto userDto) {UserLoginVo userLoginVo = userService.login(userDto);return Result.success(userLoginVo);}
}
  • 业务层
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Resourceprivate RedisTemplate<String,String> redisTemplate;/*** 新增用户/注册* @param userDto*/public void addUser(UserDto userDto) {User user = userMapper.selectByUserName(userDto.getUsername());if (user != null) {throw new BusinessException(ResponseCodeEnum.CODE_601);}user = new User();BeanUtils.copyProperties(userDto, user);user.setCreateTime(new Date());user.setLoginTime(new Date());userMapper.insert(user);}@Overridepublic UserLoginVo login(UserDto userDto) {User user = userMapper.selectByUserNameAndPassword(userDto.getUsername(),userDto.getPassword());if (user == null) {throw new BusinessException("用户名或密码错误");}String token = UUID.randomUUID().toString();redisTemplate.opsForValue().set("loginDemo:user:token:" + token, user.getId().toString());UserLoginVo userLoginVo = new UserLoginVo();userLoginVo.setUser(user);userLoginVo.setToken(token);return userLoginVo;}
}
  • mapper层
@Mapper
public interface UserMapper extends BaseMapper<User>{void addUser(User user);@Select("select * from user where username = #{username}")User selectByUserName(String username);User selectByUserNameAndPassword(String username,String password);
}
  • UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.kkk.mapper.UserMapper"><insert id="addUser">INSERT INTO user (username,password,email) VALUES (#{username},#{password},#{email})</insert><select id="selectByUserNameAndPassword" resultType="com.kkk.domain.entity.User">select * from user<where><if test="username != null and username != ''">and user.username = #{username}</if><if test="password != null and password != ''">and user.password = #{password}</if></where></select></mapper>

以上代码仅供参考,具体逻辑可以根据自己的业务来实现

2. 补充介绍

以上提供的示例代码逻辑大致为用户登录后根据UUID生成一个token,接着将token作为唯一标识键存入redis缓存中,值为用户id,之后可以根据用户请求头中的token去redis中获取用户id,当然你也可以根据自己的实际需求来。

3.AOP切面编程实现登录拦截校验

在这里插入图片描述

首先目录结构如图所示

  • GlobalInterceptor类
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface GlobalInterceptor {/*** 校验登录** @return*/boolean checkLogin() default true;/*** 校验管理员** @return*/boolean checkAdmin() default false;
}
  • GlobalOperationAspect类
@Component("operationAspect")
@Aspect
public class GlobalOperationAspect {@Resourceprivate RedisTemplate<String,String> redisTemplate;@Resourceprivate UserMapper userMapper;private static Logger logger = LoggerFactory.getLogger(GlobalOperationAspect.class);@Before("@annotation(com.kkk.annotation.GlobalInterceptor)")public void interceptorDo(JoinPoint point) {try {Method method = ((MethodSignature) point.getSignature()).getMethod();GlobalInterceptor interceptor = method.getAnnotation(GlobalInterceptor.class);if (null == interceptor) {return;}/*** 校验登录*/if (interceptor.checkLogin() || interceptor.checkAdmin()) {checkLogin(interceptor.checkAdmin());}} catch (BusinessException e) {logger.error("全局拦截器异常", e);throw e;} catch (Exception e) {logger.error("全局拦截器异常", e);throw new BusinessException(ResponseCodeEnum.CODE_500);} catch (Throwable e) {logger.error("全局拦截器异常", e);throw new BusinessException(ResponseCodeEnum.CODE_500);}}//校验登录private void checkLogin(Boolean checkAdmin) {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String token = request.getHeader("token");String value = redisTemplate.opsForValue().get("loginDemo:user:token:"+token);if (value == null) {throw new BusinessException("登录超时");}Long userId = Long.valueOf(value);User user = userMapper.selectById(userId);if (user == null) {throw new BusinessException("请求参数错误,请联系管理员");}if (checkAdmin) {// 校验是否为管理员操作权限// 后续处理}}
}

接下来只需要在需要拦截的接口处添加自定义注解就可以了

如:

@RestController
@RequestMapping("/test")
public class TestController {@GlobalInterceptor@GetMapping("/test")public String test() {return "ok";}
}

4. 测试

  • 首先登录后获取用户token
    在这里插入图片描述

  • 再将token放入请求头中
    在这里插入图片描述

一个AOP切面编程实现的登录拦截就实现了

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

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

相关文章

【js】URL处理

背景 有这样子一个url&#xff0c;search部分的value可能包含空格&#xff0c;也可能是一个对象&#xff0c;如何正确解析这样子的url呢&#xff1f; search如下&#xff0c;?accountId144115188076933939&accountNamemock name&xxx {"accountId": "…

重温设计模式--享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

用python ollama qwen2.5 开发一个AI修仙游戏

用 Python Ollama (Qwen2.5) 开发一个 AI 修仙游戏 简介 本文将介绍如何使用 Python 和 Ollama (Qwen2.5 模型) 开发一个文字版修仙游戏。这个游戏具有以下特点&#xff1a; 完整的修仙世界观和成长体系基于 AI 生成的动态剧情和事件丰富的物品系统(功法、丹药、灵宝等)社交…

Android 常用布局

在Android中&#xff0c;ViewGroup是布局的基类&#xff0c;用于管理和组织其他视图。除了ViewGroup本身&#xff0c;还有一些其他的ViewGroup子类&#xff0c;它们提供了不同的布局和视图管理功能。以下是一些常见的ViewGroup子类&#xff1a; AdapterViewFlipper&#xff1a…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞&#xff1f;如何防范&#xff1f; 2. SQL 注入什么是SQL注入&#xff1f;如何防范&#xff1f; 3. 命令执行漏洞什么是命令执行漏洞&#xff1f;如何防范&#xff1f; 4. 越权漏洞什么是越…

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02

在嵌入式开发中&#xff0c;I2C&#xff08;Inter-Integrated Circuit&#xff09;是一种常用的串行通信协议&#xff0c;广泛应用于与外设&#xff08;如 EEPROM、传感器、显示屏等&#xff09;进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器&#xff0c;它提供 2Kbit…

NS3学习——队列管理机制

目录 1.介绍 2.被动式队列管理机制 2.1 优缺点 2.1.1 TCP全局同步现象 3.主动式队列管理机制 3.1 RED算法概述 3.2 RED具体算法 3.2.1 计算队列平均长度 3.2.2 计算丢弃包的概率 1.介绍 由于路由器是基于包交换的设备&#xff0c;为了处理多个数据包同时向同一端口…

HDR视频技术之十一:HEVCH.265 的 HDR 编码方案

前文我们对 HEVC 的 HDR 编码优化技术做了介绍&#xff0c;侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案&#xff0c; 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特&#xff0c;一般的 HDR 信号倾向于使用 10…

linux普通用户使用sudo不需要输密码

1.root用户如果没有密码&#xff0c;先给root用户设置密码 sudo passwd root #设置密码 2.修改visudo配置 su #切换到root用户下 sudo visudo #修改visudo配置文件 用户名 ALL(ALL) NOPASSWD: ALL #下图所示处新增一行配置 用户名需要输入自己当前主机的用户名

大语言模型中的Agent;常见的Agent开发工具或框架

大语言模型中的Agent 大语言模型中的Agent是指以大语言模型为核心驱动,具有自主理解、感知、规划、记忆和使用工具等能力,能够自动化执行复杂任务的系统.以下是一些例子: AutoGPT:它相当于一个完整的工具包,可以为各种项目构建和运行自定义AI Agent。使用OpenAI的GPT-4和…

【时间之外】IT人求职和创业应知【74】-运维机器人

目录 OpenAI最强推理模型o3发布&#xff0c;AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如…

Android10 rk3399 以太网接入流程分析

Netd守护进程服务 Netd模块是Android中专门负责网络管理和控制的后台守护进程开发板路径./etc/init/netd.rc service netd /system/bin/netdclass mainsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inetonres…

框架专题:反射

1. 什么是反射&#xff1f; 简单来说&#xff0c;反射是一种程序自省的能力&#xff0c;即在程序运行时动态地获取其结构信息或操作其行为。这包括类、方法、属性等元信息。反射的核心在于让代码变得更加动态化&#xff0c;从而突破静态语言的限制。 以Java为例&#xff0c;反…

Git:查看分支、创建分支、合并分支

一、查看分支 查看的git命令如下&#xff1a; git branch # 列出本地已经存在的分支&#xff0c;并且当前分支会用*标记 git branch -r # 查看远程版本库的分支列表 git branch -a # 查看所有分支列表&#xff08;包括本地和远程&#xff0c;remotes/开头的表示远程分支&…

【深度学习】论文复现-对论文数据集的一些处理

如何书写伪代码&#xff1a; ref:https://www.bilibili.com/video/BV12D4y1j7Zf/?vd_source3f7ae4b9d3a2d84bf24ff25f3294d107 i14时产出的图片比较合理 import json import os.path from matplotlib.ticker import FuncFormatter import pandas as pd import matplotlib.py…

C#调用WebService的方法

一、前言 在日常工作中&#xff0c;如果涉及到与第三方进行接口对接&#xff0c;有的会使用WebService的方式&#xff0c;这篇文章主要讲解在.NET Framework中如何调用WebService。 1.创建WebService &#xff08;1&#xff09;新建项目——模板选择ASP.NET Web 应用程序 &a…

Java CPU飙升 排查

一、概述 CPU 是整个电脑的核心计算资源&#xff0c;CPU的最小执行单元是 线程&#xff1b; 在现代操作系统中&#xff0c;进程和线程是两种主要的调度单位&#xff1b; 进程是程序中正在运行的一个应用程序&#xff0c;而线程是系统分配处理器时间资源的基本单位。一个进程至少…

Qt creator ,语言家功能缺失解决方法

1、找到工具->外部->配置 2、添加目录&#xff0c;双击命名语言家 3、在语言家目录下&#xff0c;添加工具 双击重命名lupdate&#xff0c;即更新翻译 %{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate%{CurrentDocument:Project:FilePath}%{CurrentDocument:Projec…

12寸半导体厂等保安全的设计思路

等级保护(等保)二级和三级的主要区别在于安全要求的严格程度、所需部署的安全措施和设备、以及对安全事件响应和处理的能力。以下是等保二级和三级之间的一些关键区别: 一、 安全要求严格程度: - 等保二级:适用于需要较高安全保护的信息系统,要求能够防范轻微的恶意攻击…

Docker Compose 配置指南

目录 1. Docker Compose 配置1.1 基本配置结构1.2 docker-compose.yml 的各部分1.3 常用配置选项 2. Docker Compose 使用方法2.1 创建 Docker Compose 配置文件2.2 启动服务2.3 查看容器状态2.4 查看服务日志2.5 停止服务2.6 重新构建服务 3. Docker Compose 常用命令3.1 dock…