【二十七】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能

    springboot篇章整体栏目: 


【一】springboot整合swagger(超详细

【二】springboot整合swagger(自定义)(超详细)

【三】springboot整合token(超详细)

【四】springboot整合mybatis-plus(超详细)(上)

【五】springboot整合mybatis-plus(超详细)(下)

【六】springboot整合自定义全局异常处理

【七】springboot整合redis(超详细)

【八】springboot整合AOP实现日志操作(超详细)

【九】springboot整合定时任务(超详细)

【十】springboot整合redis实现启动服务即将热点数据保存在全局以及redis(超详细)

【十一】springboot整合quartz实现定时任务优化(超详细)

【十二】springboot整合线程池解决高并发(超详细,保你理解)

【十三】springboot整合异步调用并获取返回值(超详细)

【十四】springboot整合WebService(超详细)

【十五】springboot整合WebService(关于传参数)(超详细)

【十六】springboot整合WebSocket(超详细)

【十七】springboot整合WebSocket实现聊天室(超详细)

【十八】springboot实现自定义全局异常处理

【十九】springboot整合ElasticSearch实战(万字篇)

【二十】springboot整合过滤器实战

【二十一】springboot整合拦截器实战并对比过滤器

【二十二】springboot整合activiti7(1) 实战演示篇

【二十三】springboot整合spring事务详解以及实战

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透

        在开发中,获取当前登录用户的功能是一个必须的功能,比如保存创建人、修改人等操作。以前通过session去set和get方法(每个方法的参数列表都需要加上HttpServletRequest request参数)或者类似springsecurity等框架实现获取当前登录人信息。下面我分享一个目前项目上使用的方式。

        qq交流群导航——>231378628

大致流程如下:

目录

一、ThreadLocal

二、HandlerMethodArgumentResolver

三、实战Demo


一、ThreadLocal

        线程局部变量,创建一个线程变量后,针对这个变量可以让每个线程拥有自己的变量副本,每个线程是访问的自己的副本,与其他线程的相互独立。

二、HandlerMethodArgumentResolver

        该接口用于预先处理请求参数,他有如下两个方法:

  • supportsParameter: 判断请求参数是否是支持该解析器(返回true表示支持,会继续调用resolveArgument方法,返回false表示不支持,参数解析结束不会继续调用resolveArgument方法)。
  • resolveArgument: 参数解析的具体实现逻辑,最后返回参数具体解析后封装的对象。

三、实战Demo

        1、拦截器

        模拟前端请求携带token,若传1,假设从缓存获取的用户信息是张三,否则是李四。并将用户信息塞入线程变量。

        2、全局用户类

        采用饿汉式单例模式 ,一开始就预先将线程变量创建完成,拦截器中给线程变量赋值后,业务中直接使用。

        3、自定义注解

        用于放在参数列表,判断某接口是否支持自定义参数解析器。

        4、自定义参数解析

        自定义参数解析类,集成HandlerMethodArgumentResolver接口,并重写他的两个方法,此处判断方法参数上是否包含我们的自定义注解,若包含则说明支持该解析器,返回true,进入下面的方法执行。 

        重写的resolveArgument方法便将线程变量的值进行返回,返回到该注解对应的参数里面。

        5、配置

        编写配置类,继承WebMvcConfigurer接口,重写添加拦截器和添加参数解析器方法,将自定义的拦截器和解析器加上。

        6、测试

        测试两种方法获取当前登录用户信息。 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.部署LVS-DR群集

文章目录 部署LVS-DR群集LVS-DR数据包流向分析LVS-DR中的ARP问题问题一问题二 LVS-DR部署调度器配置节点服务器配置NFS服务器配置 ipvsadm 部署LVS-DR群集 LVS-DR数据包流向分析 为方便进行原理分析,将Client与群集机器放在同一网络中,数据包流经的路线…

代码随想录第55天

1.判断子序列: 动态规划五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 注意这里是判断s是否…

OneFormer:规则通用图像分割的一个Transformer

文章目录 OneFormer: One Transformer to Rule Universal Image Segmentation摘要本文方法实验结果 OneFormer: One Transformer to Rule Universal Image Segmentation 摘要 通用图像分割并不是一个新概念。过去统一图像分割的尝试包括场景解析、全景分割,以及最…

spring boot + xxl-job 分布式任务调度

一、介绍 1、任务调度 1.1、什么是任务调度 我们可以先思考一下下面业务场景的解决方案: 某电商系统需要在每天上午10点,下午3点,晚上8点发放一批优惠券。某财务系统需要在每天上午10点前结算前一天的账单数据,统计汇总。某电…

chatgpt赋能python:如何在Python中添加空行?

如何在Python中添加空行? 如果你是一个有经验的Python工程师,在编写代码时你可能会遇到需要添加空行的情况。但是有几种方法可以实现这一点,你应该用哪种方法呢?在本文中,我们将探讨如何在Python中添加空行以及各种添…

Lambda表达式与函数式编程

文章目录 函数式编程——Stream流概述为什么学?函数式编程思想 Lambda表达式概述Lambda表达式的前身省略规则 Stream流概述案例数据准备创建流中间操作终结操作reduce归并注意事项 Optional概述创建对象安全消费值获取值安全获取值过滤数据转换 函数式接口常用的默认方法 方法…

5Why分析法

5Why分析法 由丰田公司的大野耐一提出的对一个问题点连续以5个“为什么”来自问,以追究其根本原因的分析方法。 模型介绍 所谓5Why分析法,又称“5问法”,也就是对一个问题点连续以5个“为什么”来提问,以追究其根本原因。虽为5个…

高通KMD框架详解

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、概览二、核心模块解析三、模块初始化四、处理UMD CSL请求 一、概览 利用了V4L2可扩展这一特性,高通在相机驱动部分实现了自有的一套KMD…

RPC介绍

RPC介绍 1 介绍1.1 概述1.2 RPC的分裂发展 2 历史发展1969年11月,ARPAnet 开始建立。1974年:Jon Postel 和 Jim White发表了RFC6741975年:RFC684 作为RFC 674 的注释发表,对RFC 674 的争议进行回复。1976年:RFC 707 发…

【漏洞复现】Apache RocketMQ 命令注入漏洞(CVE-2023-33246)

文章目录 前言声明一、漏洞描述二、漏洞危害三、影响版本四、环境搭建五、漏洞复现六、修复建议 前言 RocketMQ 是阿里巴巴在2012年开发的分布式消息中间件,专为万亿级超大规模的消息处理而设计,具有高吞吐量、低延迟、海量堆积、顺序收发等特点。同时它…

ChatGPT无限可能性:自然语言生成的奥秘

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! ChatGPT无限可能性:自然语言生成的奥秘 数字化时代:跨越语言和文化障碍 冰岛是北大西洋中部的一个岛国,拥有充满活力的科技产业和…

Python3数据分析与挖掘建模(12)复合分析-相关分析与实现示例

1. 相关分析 1.1 概述 相关分析是一种统计分析方法,用于研究两个或多个变量之间的关系和相互影响程度。它帮助我们了解变量之间的线性关系、趋势和相关程度。 在相关分析中,常用的指标是相关系数,用于衡量两个变量之间的相关程度。最常见的…

Same Symbol | 哇咔咔!!!盘点一下表达矩阵中重复基因的处理方法!~

1写在前面 医院天天叫我们填问卷,我真是不能理解。🫠 动不动就问我们对医院的福利满意吗,对自己的收入满意吗,觉不觉得工作负荷太重了???🙂 我们满不满意,觉不觉得累&…

【ChatGPT】数据科学 ChatGPT Cheat Sheet 书籍分享(阿里云盘下载)

封皮 以下为书中部分内容的机器翻译 我们的重要提示指南 1. 以 AI 角色的描述开始提示。 例如,“你是{x}”或“我希望你扮演{x}”。如果您不确定,请尝试“你是一个有帮助的助手”。 例如,您是 OpenAI 的数据科学家,您正在研究大型…

Java中线程的生命周期

Java中线程的生命周期 Java中线程的声明周期与os中线程的生命周期不太一样,java中线程有6个状态,见下: NEW: 初始状态,线程被创建出来但没有被调用 start() 。RUNNABLE: 运行状态,线程被调用了 start()等待运行的状态…

C语言—程序环境和预处理

程序环境和预处理 程序的翻译环境和执行环境编译、链接翻译环境编译预处理(预编译)编译汇编 链接 编译环境几个阶段的总结 运行环境(执行环境)预处理详解预定义符号#define#define 定义标识符#define 定义宏#define 替换规则#和##…

【SpringMVC】SSM整合

1,SSM整合 前面我们已经把Mybatis、Spring和SpringMVC三个框架进行了学习,今天主要的内容就是把这三个框架整合在一起完成我们的业务功能开发,具体如何来整合,我们一步步来学习。 1. 流程分析 (1) 创建工程 创建一个Maven的web…

傅里叶级数简介

先看动图 将函数f(x) 用 sin(nx) cos(nx) 的形式表示出来的方式就是傅里叶级数 这里有几个使用条件 收敛性:符合迪力克雷收敛条件。简单理解为 f(x) 必须是一个丝滑的曲线。周期性: f(x) 必须是一个周期函数 还有一个基础条件,三角函数具…

200SMART CPU输入/输出接线的几个关键点

总结来看,S7-200系列PLC提供4个不同的基本型号的8种CPU,其接线方式也可大致分为6种: 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外,我们还需要了解200smart PLC的数…

从零玩转系列之微信支付实战基础框架搭建

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 在此之前已经更新了微信支付开篇、微信支付安…