Springboot登录验证的统一拦截处理

news2024/11/28 0:49:00

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理

背景

如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证,代码重复,所以在本篇提供一个解决方案:

定义一个拦截器,把请求都进行统一的处理,如果Session中存在用户的信息那么就放行;如果不存在,那么就直接出现异常报错未登录。在这样的一个方案中其实还存在着一个问题,在业务逻辑中我要去获取用户的信息,那不又是很麻烦了?这里可以通过ThreadLocal解决。

为什么用ThreadLocal:当用户发起请求时,会访问我们像tomcat注册的端口,任何程序想要运行,都需要有一个线程对当前端口号进行监听,tomcat也不例外,当监听线程知道用户想要和tomcat连接连接时,那会由监听线程创建socket连接,socket都是成对出现的,用户通过socket像互相传递数据,当tomcat端的socket接受到数据后,此时监听线程会从tomcat的线程池中取出一个线程执行用户请求,在我们的服务部署到tomcat后,线程会找到用户想要访问的工程,然后用这个线程转发到工程中的controller,service,dao中,并且访问对应的DB,在用户执行完请求后,再统一返回,再找到tomcat端的socket,再将数据写回到用户端的socket,完成请求和响应通过以上讲解,我们可以得知 每个用户其实对应都是去找tomcat线程池中的一个线程来完成工作的, 使用完成后再进行回收,既然每个请求都是独立的,所以在每个用户去访问我们的工程时,我们可以使用threadlocal来做到线程隔离,每个线程操作自己的一份数据

定义一个ThreadLocal线程工具类

便于对线程内部的值进行处理。

public class UserHolder {
    public static final ThreadLocal<User> userThreadLocal = new ThreadLocal<>();
    public static void setValue(User user){
        userThreadLocal.set(user);
    }
    public static User getValue(){
        return userThreadLocal.get();
    }
    public static  void clear(){
        userThreadLocal.remove();
    }
}

定义拦截器

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 获取 session
        HttpSession session = request.getSession();

        // 检查用户是否已登录
        if (session.getAttribute("user") == null) {
            // 用户未登录,进行相关处理
            throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
        }

        // 从 session 中获取用户数据
        User user = (User) session.getAttribute("user");

        // 将用户数据存储到 ThreadLocal 中,以便在整个请求周期内访问
        UserHolder.setValue(user);

        // 进行其他逻辑验证,根据需求自行添加

        return true; // 允许请求继续执行
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 在请求处理之后执行,可以对 ModelAndView 进行修改
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 在请求完成之后执行,用于资源清理等操作

        // 清理 ThreadLocal 中的用户数据,防止内存泄漏
        UserHolder.clear();
    }
}

让拦截器生效

通过配置让拦截器生效

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器
        // excludePath 就是排除在外被拦截的路径
        registry.addInterceptor(new LoginInterceptor())
            	.addPathPatterns("/**")  
                .excludePathPatterns(
                        "/user/login"
                );
    }
}

然后就可以啦

测试

测试Controller

@RestController
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;
    @PostMapping("/login")
    public BaseResponse<User> login(HttpSession session){
        System.out.println("Hello");
        Random random = new Random(new Date().getTime()) ;
        User user = new User(random.nextLong(), "123","123454","123");
        session.setAttribute("user",user);
        return ResultUtils.success(user);
    }
    @GetMapping("/get")
    public BaseResponse<User> get(){
        return ResultUtils.success(UserHolder.getValue());
    }
}

测试结果

开始没有登录

在这里插入图片描述

进行登录

在这里插入图片描述

再次获取get请求就可以了

在这里插入图片描述

这里我出现一个问题我一直调试了很久,md,就是在配置拦截器的时候添加路径首先把所有路径进行拦截,然后放行/user/login就好,我的这个项目在配置文件中给所有的路径首先加了一个/api这样的前缀,然后我在拦截路径的时候都加了api,这个其实是不用加的,直接上路径就好了,spring自动会加。

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

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

相关文章

【算法练习Day2】有序数组的平方长度最小子数组螺旋矩阵II

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 有序数组的平方暴力求解…

2023/9/20总结

maven maven本质是 一个项目管理工具 将项目开发 和 管理过程 抽象成 一个项目对象模型&#xff08;POM&#xff09; POM &#xff08;Project Object Model&#xff09; 项目对象模型 作用 项目构建 提供标准的自动化 项目构建 方式依赖管理 方便快捷的管理项目依赖的资源…

【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城

在b站听了袁老师的开发课&#xff0c;做了一点笔记。 01-项目环境搭建_哔哩哔哩_bilibili 基于springboot框架的电脑商城项目&#xff08;一&#xff09;_springboot商城项目_失重外太空.的博客-CSDN博客 项目环境搭建 1.项目分析 1.项目功能:登录、注册、热销商品、用户管…

2023年8月京东户外鞋服市场(京东数据运营)

当前&#xff0c;户外活动的热潮使得户外鞋服市场备受青睐&#xff0c;带动了整个市场的高增长。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年8月份&#xff0c;京东平台户外鞋服市场的销量为46万&#xff0c;同比增长约25%&#xff1b;销售额为9500万&#xf…

视觉检测系统可以检测太阳能电池片哪些方面的缺陷?

近年来&#xff0c;随着全球工业化进程的不断加快&#xff0c;能源与环境危机成为一个亟待解决的问题。为此&#xff0c;太阳能作为一种清洁可再生的能源&#xff0c;现已被广泛应用于各领域。太阳能电池片作为太阳能转换为电能的核心载体&#xff0c;其质量的好坏决定着电能的…

Cannot find module ‘core-js/modules/es6.regexp.constructor‘

npm run dev 之后报如下错误 解决方法&#xff1a;npm install core-js2 如果超时或者下载时间慢可以尝试 用cnpm install core-js2

【送书】实现可观测性平台的技术要点是什么?

文章目录 实现可观测性平台的技术要点是什么?兼容全域信号量所谓全域信号量有哪些&#xff1f;统一采集和上传工具统一的存储后台自由探索和综合使用数据总结 实现可观测性平台的技术要点是什么? 随着可观测性理念的深入人心&#xff0c;可观测性平台已经开始进入了落地阶段…

爸妈让我放弃百度,选择东软

作者&#xff1a;阿秀 InterviewGuide大厂面试真题网站&#xff1a;https://top.interviewguide.cn 这是阿秀的第「305」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 目前已经是九月下旬了&#xff0c;秋招已经进入中后期了&#xff0c;很多公司已经开启秋招有一段时间了&…

C++实现WebSocket通信(服务端和客户端)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql&#xff0c;程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…

软件项目管理【UML-类图】

前言 UML图有很多种&#xff0c;但是并非必须掌握所有的UML图&#xff0c;才能完整系统分析和设计工作。一般说来&#xff0c;在UML图中&#xff0c;只要掌握类图、用例图、时序图的使用&#xff0c;就能完成大部分的工作。也就是说&#xff0c;掌握UML的20%&#xff0c;就能做…

Vivado中增加源文件界面中各选项的解释

文章目录 官方解释结论总结验证增加单个.v文件增加文件夹Copy sources into project 参考文献 本文对Vivado中增加源文件界面Add or Create Design Sources和Add or Create Smulaton sources中的选项Scan and add RTL include files into project、Copy sources into project和…

影响软文效果的三大因素,一定要牢记

在信息技术发展速度越来越快的今天&#xff0c;企业宣传时已经不再局限于传统的硬广&#xff0c;开始利用软文来提升曝光率&#xff0c;软文作为一种全新的宣传手段&#xff0c;具有覆盖面广、成本低且持续时间长&#xff0c;但是有三大因素稍不注意就会影响软文发布的效果&…

八月份跳槽了,历经华为测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试华为的测试开发工程师的时候&#xff0c;灵魂拷问三小…

buuctf web [极客大挑战 2019]LoveSQL

又是这样的界面&#xff0c;这糟糕的熟悉感&#xff0c;依旧使用上题套路 用户名&#xff1a; admin or 11# 密码&#xff1a; 1 有一串很像flag的字符&#xff0c;但是很可惜&#xff0c;这不是flag 看了一眼源代码&#xff0c;没有可以跳转的页面 要换个思路了&#xff0c…

C++ -- 学习系列 std::array 容器

1. std::array 是什么&#xff1f; array 容器是 C 11 标准中新增的序列容器&#xff0c;简单地理解&#xff0c;它就是在 C 普通数组的基础上&#xff0c;添加了一些成员函数和全局函数。在使用上&#xff0c;它比普通数组更安全&#xff0c;且效率并没有因此变差。 与数组一…

OmniPlan Pro 4 for Mac:引领项目管理的创新与高效

OmniPlan Pro 4是一款强大且高效的项目管理工具&#xff0c;专为Mac用户设计。它提供了一套综合性的解决方案&#xff0c;帮助用户在Mac上便捷地进行项目规划、追踪和管理。凭借其直观的界面&#xff0c;用户可以快速上手&#xff0c;并且能充分利用这款工具的各种功能。 规划…

企业如何获得用户信赖感,媒介盒子告诉你

互联网和新媒体的快速发展使得内容市场空前繁荣&#xff0c;营销方式也越来越多元化&#xff0c;消费者已经很难被夸张吸睛的营销模式打动&#xff0c;他们更倾向于选择自己信赖的产品&#xff0c;对于企业而言&#xff0c;用户信任是决定企业发展与否的关键因素&#xff0c;产…

自动直播软件开发方案:打造智能化、高效化的直播体验

一、引言 随着社交媒体和互联网的快速发展&#xff0c;直播已经成为了人们互动和传播的重要方式。然而&#xff0c;传统直播存在着人力成本高、内容质量不稳定等问题&#xff0c;因此&#xff0c;开发一款自动直软件成为了解决这些问题的关键。 二、市场需求分析 1…