实战篇04:获取用户详细信息

实战篇04:获取用户详细信息

一、接口信息

1.1 基本信息

请求路径:/user/userInfo

请求方式:GET

接口描述:该接口用于获取当前已登录用户的详细信息

1.2 请求参数

1.3 响应数据

响应数据类型:application/json

响应参数说明:

名称类型是否必须默认值备注其他信息
codenumber必须响应码, 0-成功,1-失败
messagestring非必须提示信息
dataobject必须返回的数据
|-idnumber非必须主键ID
|-usernamesrting非必须用户名
|-nicknamestring非必须昵称
|-emailstring非必须邮箱
|-userPicstring非必须头像地址
|-createTimestring非必须创建时间
|-updateTimestring非必须更新时间

响应数据样例:

{"code": 0,"message": "操作成功","data": {"id": 5,"username": "wangba","nickname": "","email": "","userPic": "","createTime": "2023-09-02 22:21:31","updateTime": "2023-09-02 22:21:31"}
}

二、业务流程

  1. 在Controller层通过JWT token获取用户名,以此来获取相应的用户数据
  2. service与mapper复用之前的,为controller提供服务

在这里插入图片描述

三、编写Controller

  1. 在UserController类中添加用户信息功能
@GetMapping("/userInfo")
public Result<User> userInfo(@RequestHeader(name = "Authorization") String token){// 根据用户名查询用户Map<String, Object> map = JwtUtil.parseToken(token);System.out.println(map);String username = (String) map.get("username");User user = userService.findByUserName(username);return Result.success(user);
}
  1. 此时,返回user对象会将密码进行返回,需要在User类中对password字段添加注解:@JsonIgnore
package com.example.bigevent.pojo;import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;import java.time.LocalDateTime;@Data
public class User {private Integer id;//主键IDprivate String username;//用户名@JsonIgnore // 转换成jason时忽略此字段private String password;//密码private String nickname;//昵称private String email;//邮箱private String userPic;//用户头像地址private LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间
}
  1. 由于User类中时间:createTime与数据库中字段:create_time,不一致。在application.yml中开启驼峰转换即可显示信息
mybatis:configuration:map-underscore-to-camel-case: true #开启驼峰命名和下划线命名的自动转换

四、改进Controller

4.1、改进原因

由于在拦截器中解析过token,因此在Controller层不需要重复解析操作,为此需要改进Controller

4.2、ThreadLocal介绍

4.2.1、优势

可以存取数据:set()/get();且该方法线程安全

在这里插入图片描述

4.2.2、使用测试类对ThreadLocal进行测试

@Test
public void testThreadLocalSetAndGet(){// 提供一个ThreadLocal对象ThreadLocal tl = new ThreadLocal();// 开启两个线程new Thread(()->{tl.set("萧炎");System.out.println(Thread.currentThread().getName()+": "+tl.get());System.out.println(Thread.currentThread().getName()+": "+tl.get());},"蓝色").start();new Thread(()->{tl.set("药尘");System.out.println(Thread.currentThread().getName()+": "+tl.get());System.out.println(Thread.currentThread().getName()+": "+tl.get());},"绿色").start();
}

4.2.3、运行逻辑

每一个用户访问服务器时,使用同一个线程进行Controller,Service,Mapper加载访问,因此可以使用ThreadLocal进行线程隔离方式存储数据。

在这里插入图片描述

4.3、使用ThreadLocal进行优化

4.3.1、编写ThreadLocal工具类:ThreadLocalUtil

package com.example.bigevent.utils;@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

4.3.2、在拦截器中存放Jwt的token数据

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 令牌验证String token = request.getHeader("Authorization");try {Map<String, Object> claims = JwtUtil.parseToken(token);// 把数据放进ThreadLocal中ThreadLocalUtil.set(claims);// 拦截器放行return true;}catch (Exception e){response.setStatus(401);return false;}}
}

4.3.3、在Controlle层获取token数据

@GetMapping("/userInfo")
public Result<User> userInfo(/*@RequestHeader(name = "Authorization") String token*/){// 根据用户名查询用户
//        Map<String, Object> map = JwtUtil.parseToken(token);
//        System.out.println(map);
//        String username = (String) map.get("username");Map<String,Object> map = ThreadLocalUtil.get();String username = (String) map.get("username");User user = userService.findByUserName(username);return Result.success(user);
}

4.3.4、新增结束拦截器,用于释放ThreadLocal

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 令牌验证String token = request.getHeader("Authorization");try {Map<String, Object> claims = JwtUtil.parseToken(token);// 把数据放进ThreadLocal中ThreadLocalUtil.set(claims);// 拦截器放行return true;}catch (Exception e){response.setStatus(401);return false;}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 清空ThreadLocal中的数据ThreadLocalUtil.remove();}
}

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

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

相关文章

基于圆柱体镜子和光线跟踪实现镜反射观测全景观图的matlab模拟仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 光线与圆柱镜面的交点计算&#xff1a; 反射光线计算&#xff1a; 全景图坐标转换&#xff1a; 5.完整程序 1.程序功能描述 基于圆柱体镜子和光线跟踪实现镜反射观测全景观图.模拟的场景…

SV学习笔记(七)

文章目录 类型转换写在前面动态转换子类句柄赋值于父类句柄父类句柄转换为子类句柄 虚方法写在前面非虚函数的调用虚函数的调用虚方法的建议为什么使用虚方法 对象拷贝写在前面赋值和拷贝总结 回调函数写在前面实例完成回调函数功能需要三步&#xff1a; 参数化类写在前面实现一…

如何使用极狐GitLab Maven 仓库?

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了如何使用极狐GitLa…

TPAMI:计算机学会像人脑一样“听话”了!清华团队实现混合语音分离技术突破

我们的大脑在处理声音信息时有一个特长&#xff1a;可以将注意力集中在感兴趣的对话或声音上&#xff0c;忽略其它无关的声音或者噪音。我们每天都在不知不觉地运用这种特长&#xff0c;在通勤的地铁上、嘈杂的餐厅里&#xff0c;广播声、音乐声、多人同时说话的声音&#xff0…

Redis中的持久化

持久化 .RDB手动触发save命令bgsave命令 自动触发bgsave的具体流程RDB的处理保存压缩校验 RDB的优缺点 AOF命令写入文件同步重写机制启动时恢复数据 本章重点回顾 . RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发 手动触发…

【Java+Springboot】----- 通过Idea快速创建SpringBoot项目操作方法

一、第一步&#xff1a; 点击选择【File】->【New】-> 【Project】 最后弹出[new Project]界面。 二、第二步&#xff1a; 1. 选择【Spring Initializr】 2. 然后选择【Project SDK】的版本 3. 然后 Choose Initializr Service URL 选择默认&#xff08;Default&#x…

JAVA8 新特性StreamAPI使用(二)

一、使用StreamAPI&#xff0c;&#xff08;基于数据模型——客户、订单和商品&#xff0c;实体关系图如下&#xff0c;客户可以有多个订单&#xff0c;是一对多的关系&#xff0c;而产品和订单的关系是多对多的&#xff09;需求如下&#xff1a; 二、Stream API思维导图 三、需…

【Java EE】SpringBoot的创建与简单使用

文章目录 &#x1f340;环境准备&#x1f333;Maven&#x1f332;SpringBoot是什么&#x1f384;Spring Boot 项目创建&#x1f338;使用Idea创建&#x1f338;创建SpringBoot项⽬&#x1f338;SpringBoot项目的运行 ⭕总结 &#x1f340;环境准备 如果你的IDEA是专业版&#…

六、从零实战企业级K8S本地部署ThingsBoard专业版集群

1、从 docker hub 拉取 ThingsBoard PE 映像(所有节点) 1.1、查看k8s信息(主节点) kubectl cluster-info #查看k8s集群信息 kubectl get node #查看节点信息 kubectl get pod -A #查看内部组件1.2、从 docker hub 拉取 ThingsBoard PE 映像(所有…

SYS-2722音频分析仪SYS2722

181/2461/8938产品概述&#xff1a; Audio Precision 2722 音频分析仪是 Audio Precision 屡获殊荣的 PC 控制音频分析仪的旗舰型号&#xff0c;长期以来一直是音频设备设计和测试的全球公认标准。功能齐全的 SYS-2722 提供了测试转换器技术最新进展所需的无与伦比的失真和噪声…

Linux云计算之网络基础9——园区网络架构项目

要求构建大型园区网络架构&#xff0c;方案如下&#xff1a; 园区A 园区c 公司B 要求&#xff1a; 1、A公司园区网络 一台汇聚层三层交换机&#xff0c;两台接入层二层交换机。 出口有一台路由器。 2、A园区有五台服务器。 分别为两台 WEB 服务器&#xff0c;…

专注项目管理的Mac工具 - Project Office Pro 最新版

Project Office Pro for Mac是一款功能强大的项目管理软件&#xff0c;旨在帮助用户更好地管理和跟踪项目进展&#xff0c;提高工作效率和质量。以下是该软件的主要功能介绍&#xff1a; 项目创建与编辑&#xff1a;用户可以根据自己的需求自定义项目计划&#xff0c;包括设置…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码&#xff0c;技术框架&#xff1a;Vue&#xff0c;Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态&#xff0c;确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术&#xff0c;为手术患者…

玩机进阶教程-----高通9008线刷XML脚本修改备份 檫除的操作步骤解析

在高通9008官方固件中我们可以看到刷写需要的脚本rawprogram0.xml和辅助脚本patch0.xml&#xff0c;脚本的作用在于将固件内各个分区对应写入手机内。根据分区地址段。然后判断脚本中那些分区不写入。以下步骤将分析emmc字库为例来讲解如何将默认刷入脚本修改为备份 檫除脚本。…

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…

搭建电商购物独立站抓取主流电商产品数据的方法:工具+电商数据采集API接口

分享一个抓取数据产品的方法&#xff0c;也是别人给我说的。 想做一个联盟产品相关的网站&#xff0c;然后需要采集电商网站的产品。咨询大佬告诉我&#xff0c;大量级电商商品数据的采集可以接入专业的电商数据采集API接口&#xff0c;也可以用webscrsper&#xff0c;于是乎就…

bootstrap+thymeleaf 页面多选回显时莫名其妙多了

bootstrapthymeleaf 页面多选回显时莫名其妙多了 问题现象问题分析问题处理总结 问题现象 今天遇到的问题的描述正如标题中的一样&#xff0c;就是后台管理系统在配置完内容后点击保存&#xff0c;回显时发现页面竟然莫名其妙多了一些数据。项目整体后台管理系统采用的是boots…

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测

回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-GPR基于冠豪猪算法优化高斯过程回归的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于CPO-GPR基于冠豪猪算法优化高斯…

【Consul】基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制

【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制✨ 这应该是目前全网最全的使用golang手…

Git命令(1)[删除,恢复与移动]

文章目录 1.删除文件1.1命令----rm <filename>1.2命令----git rm <filename>1.1命令----git rm <filename> -f 2.恢复文件2.1命令----git restore <filename>2.1命令----git restore --staged <filename> 3.重命名文件3.1命令----mv 旧文件 新文…