springboot实战学习(9)(配置mybatis“驼峰命名“和“下划线命名“自动转换)(postman接口测试统一添加请求头)(获取用户详细信息接口)

  • 接着学习。之前的博客的进度:完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用以及完成了"登录认证"(生成与验证JWT令牌)具体往回看了解的链接如下。

springboot实战学习(8)(登录接口中使用“JWT令牌“完成登录认证)(拦截器的创建与注册)-CSDN博客文章浏览阅读525次,点赞10次,收藏6次。本篇博客主要学习和介绍了如何使用拦截器,去实现用户未登录时,用户不能访问其它接口(除了登录、注册)。其中先是进行简单粗暴的每个方法中直接完成JWT令牌的生成与校验。后面改变策略,使用拦截器处理所有接口的JWT令牌的生成和校验。所有的测试因为还未完成前端,所以都在postman中测试后端的接口,查看响应回来的数据......https://blog.csdn.net/m0_74363339/article/details/142463934?spm=1001.2014.3001.5501

  • 在已完成开发注册、登录的接口的前提下。这篇博客主要完成获取用户详细信息。

目录

一、明确需求

(1)部分展示(最终需要完成的)

二、查看接口文档

(1)基本的信息(请求路径、请求方式、描述)

(2)请求参数(无)

(3)响应数据。

三、实现思路

(1)UserController层

(2)UserService层

(3)UserMapper层

四、开始操作

(0)Result类与JWT令牌工具类

(1)回到UserController类中

(2)重启工程。回到postman开始测试。

(I)测试结果。请求成功!

(II)postman中测试时,集合(Collections)一下的所有接口都可以统一添加相同请求头。

(3)问题与解决

.yml配置文件中配置mybatis“开启驼峰命名——>下划线命名的自动转换”。


一、明确需求

(1)部分展示(最终需要完成的)
  • 当用户登录成功后,需要跳转到首页。
  • 首页的导航栏这一块,需要展示用户的昵称、头像等。像这样的数据都需要访问后台的接口才能获取。
  • 在个人中心这部分。有个人基本资料、更新头像、重置密码等等。像这些功能都需要先查询展示,然后再进行更新。所以也需要获取用户的详细信息。

二、查看接口文档

(1)基本的信息(请求路径、请求方式、描述)

(2)请求参数(无)
(3)响应数据。
  • 响应数据依然是"code"、"message"、"data"。
  • data对应的object类型的数据。如下面的响应数据样例。它有一个大括号,是一个对象。里面有("id"、"username"、"nickname"(昵称)、email、userPic(邮箱地址)、创建和更新时间)。

三、实现思路

(1)UserController层
  • 同样,也需要在类'"UserController"里面声明一个方法。方法上边添加注解@GetMapping,因为现在是一个get请求。
  • 指定的映射路径是:"/userInfo"。
  • 而且在方法的内部,需要根据用户名去查询。注意:该用户名是已登录的用户名。
  • 注意这个用户名的获取方式!!虽然这里没有请求参数,但是我们所有的接口都要求用户携带token令牌。而且程序在登录时生成的"JWT令牌"里面存放了用户的id和username。则用户名可以从token中获取
  • 所以要在方法里声明一个参数。名为"Authorization"的请求头,有了token后,就可以解析token,然后获取到用户名了。

(2)UserService层

之前已经完成

(3)UserMapper层

之前已经完成

四、开始操作

(0)Result类与JWT令牌工具类
package com.feisi.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//统一响应结果
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {private Integer code;//业务状态码  0-成功  1-失败private String message;//提示信息private T data;//响应数据//快速返回操作成功响应结果(带响应数据)public static <E> Result<E> success(E data) {return new Result<>(0, "操作成功", data);}//快速返回操作成功响应结果public static Result success() {return new Result(0, "操作成功", null);}public static Result error(String message) {return new Result(1, message, null);}
}

package com.feisi.utils;import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;import java.util.Date;
import java.util.Map;public class JwtUtil {private static final String KEY = "feisi";//接收业务数据,生成token并返回public static String genToken(Map<String, Object> claims) {return JWT.create().withClaim("claims", claims).withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12)).sign(Algorithm.HMAC256(KEY));}//接收token,验证token,并返回业务数据public static Map<String, Object> parseToken(String token) {return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token).getClaim("claims").asMap();}}
(1)回到UserController类中
  • 添加一个方法userInfo()。注意返回值类型为Result<User>,因为到时侯返回的是User对象。并且添加一个注解@GetMapping("/userInfo")。

  • 要得到用户名,就在参数列表里面声明一个String类型的token。然后给这个参数加上注解@RequestHeader(name= "Authorization")

  • 有了token就去解析它。
  • 解析token就要使用自己提供的工具类"JwtUtil"的方法"parseToken()"。把token传给它,它会返回一个业务数据的Map集合。
  • 并且用map.get()方法获取指定键的值。因为存的时候是字符串,所有强转为String类型的。
@GetMapping("/userInfo")public Result<User> userInfo(@RequestHeader(name = "Authorization") String token){//方法内部根据用户名查询用户Map<String, Object> map = JwtUtil.parseToken(token);String username = map.get("username").toString();//拿到username就去调用service层的据用户名查询用户方法User user = userService.findByName(username);return Result.success(user);}
(2)重启工程。回到postman开始测试。
(I)测试结果。请求成功!


(II)postman中测试时,集合(Collections)一下的所有接口都可以统一添加相同请求头。
  • 因为在postman测试时,请求头的参数与值总是每个都要重新写,很麻烦。
  • 可以直接去集合然后点击Scripts——>"Pre-request"(请求前的一个脚本)。

  • 在这里写上指定的东西即可。记得写完ctrl+s(保存一下)。
  • 到时候这个集合下的所有接口请求都会自动的把这个头携带给服务器。
  • 所有自己之前写的就不需要携带请求头了。然后当token令牌的时间过期了,也能重新登录,然后复制粘贴到这里,所有的请求就能直接快速用了。

(3)问题与解决
  • 我们发现,请求回来的数据,携带了密码。这是不安全的

  • 这就要用到spring提供的对应的注解去解决这个问题了。
  • 添加注解@JsonIgnore。作用是:springmvc把当前对象转换成json字符串的时候,忽略password,最终的json字符串中就没有password这个属性了。
  • 注意这个注解导的包要是下面这个,不然不生效。
import com.fasterxml.jackson.annotation.JsonIgnore;

  • 我们通过上面发现返回的data值,里面的email与nickname(昵称)没有值。是因为在注册的时候,只让用户填写用户名与密码。这些是当用户修改个人资料的时候就有值了。这样设置是为了用户能够快速的注册。

  • 可以看到数据库中的表user中字段"create_time"、"update_time"的创建时间都有,为啥返回的数据data中"createTime"、"updateTime"却为"null"?

  • 因为数据库里面的命名是以下划线命名,而实体类User中的变量是驼峰命名。这时候mybatis不知道咋去封装数据。
  • .yml配置文件中配置mybatis“开启驼峰命名——>下划线命名的自动转换”。

  • 映射下划线——>驼峰命名

  • 这样mybatis就会发现数据库里面的下划线字段就会去实体类找一个对应的驼峰命名

  • 重新启动springboot工程。再去postman测试。这时就对了!

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

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

相关文章

python虚拟环境创建使用

环境变量中配置 vi /etc/profile 注意安装完python环境之后要添加以下代码&#xff0c;配置虚拟环境的命令才能正确使用&#xff1a; PATH$PATH:/usr/local/python3 PATH$PATH:/usr/local/python3/bin 创建&#xff1a;virtualenv venv 激活虚拟环境&#xff1a;source ./v…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来&#xff0c;边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点&#xff0c;在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

【数据结构之线性表】有序表的合并(链表篇)

链表有序表的合并 思路图 将链表L1和L2按照顺序合并到L3中&#xff08;注&#xff1a;三个链表都是带头结点的&#xff09; A、要实现有序合并&#xff0c;必须先比较L1,L2两表中结点的大小&#xff0c;这里我们暂时先不讨论&#xff0c;直接根据图中来进行思路整理&#xff…

plt常用函数介绍二

目录 fig.add_subplot()ax.set()plt.legend()plt.subplots_adjust()plt.suptitle()plt.grid() fig.add_subplot() fig.add_subplot() 是 Matplotlib 中 Figure 对象的方法&#xff0c;用于在图形中添加子图&#xff08;subplot&#xff09;。 其语法为&#xff1a; subplot(…

linux网络编程8

24.9.25学习目录 一.原始套接字&#xff08;续&#xff09;1.sendto发送数据原始套接字1.ARP 二.Web编程1.概述2.HTML 一.原始套接字&#xff08;续&#xff09; 混杂模式&#xff1a; 指一台机器的网卡能够接受所有经过它的数据包&#xff0c;不论其目的地址是否是它&#xf…

程序人生:软件测试 非技术性面试题【建议每个测试人观看】

1、自我介绍&#xff1a;三分钟左右 2、为什么从郑州/太原离职&#xff1f; 3、你的职业规划是什么样的&#xff1f; 4、对下一家公司有什么自己的想法吗&#xff1f; 5、你觉得作为一名测试工程师&#xff0c;应该具备什么样的素养&#xff1f; 6、你觉得管理层&#xff…

echart实现渐变色-vue2

let selectData5 [{name: "有功电量",type: "bar",data: data.data.historyKwhList,unit: "MW",itemStyle: {// 使用渐变色color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "#04C886",},{of…

市面第一款 C++ 版本的U盘装机软件(即将上线)

市面大部分U盘装机软件&#xff0c;都是采用Au3脚本开发&#xff0c;而且有各种捆绑&#xff0c;闲来无聊&#xff0c;采用Qt C制作一款CU盘装机软件&#xff0c;从此告别Au3脚本&#xff0c;各种炫酷界面随便换&#xff0c;敬请期待 另外两个界面暂时不公布&#xff0c;防止Au…

C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与函数指针等相关知识点

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 通过前面几节&#xff0c;我们介绍了C的类与对象、构造与析构函数、拷贝等相关知识&#xff0c;这一篇将详细介绍了C的成员变量相关的知识点与扩展C语言后面也会继续更新知识点&#xff0c;如内联汇编&#…

Python | Leetcode Python题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

初探shell与bash使用指南

文章目录 一、shell二、bash第一步、新建脚本第二步、添加权限第三步、执行bash脚本 在日常开发中&#xff0c;经常使用到Linux服务器相关知识&#xff0c;输入命令获取想要的结果&#xff0c;本篇介绍shell 与 bash的相关知识。 一、shell 是命令行解释器&#xff0c;接收用户…

C盘空间不足--WizTree(管理空间)

WizTree&#xff1a;高效的磁盘空间分析工具 在日常使用电脑的过程中&#xff0c;磁盘空间的管理常常成为一个棘手的问题。随着文件的不断增加&#xff0c;我们的硬盘空间逐渐被占满&#xff0c;而这些文件中有很多其实并不重要。为了帮助用户更好地管理磁盘空间&#xff0c;Wi…

【AI学习】Lilian Weng:What are Diffusion Models?

读OpenAI 的 Lilian Weng博客《What are Diffusion Models?》 文章链接:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 通过浏览器的在线翻译&#xff0c;直接截图了。翻译的有些问题&#xff0c;但是基本能大概看明白了。 我只是个人的记录&#xff0c;…

Redis的三种持久化方法详解

Redis持久化机制详解 | JavaGuide Redis 不同于 Memcached 的很重要一点就是&#xff0c;Redis 支持持久化&#xff0c;而且支持 3 种持久化方式: 快照&#xff08;snapshotting&#xff0c;RDB&#xff09;只追加文件&#xff08;append-only file, AOF&#xff09;RDB 和 A…

本地生活商城开发搭建 同城O2O线上线下推广

同城本地化商城目前如火如荼&#xff0c;不少朋友咨询本地生活同城平台怎么开发&#xff0c;今天商淘云与大家分享同城O2O线上商城的设计和开发。 本地生活商城一般会涉及到区域以及频道类&#xff0c;一般下单需要支持用户定位、商家定位&#xff0c;这样利于用户可以快速找到…

51单片机快速入门之按键应用拓展

51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…

C++系列-模版

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 非类型模版参数 模板参数分类型模板参数与非类型模板参数 类型形参即&#xff1a;出现在模板参数列表&#xff0c;跟在class或者typename之类的参数类型名称 非类型形参即&am…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

三维重建的几何评价指标

1.三维重建的几何评价指标 1.1 Chamfer Distance Geometry quality (1) Chamfer Distance&#xff08;CD&#xff09; CD衡量两组点云之间的几何差异&#xff0c;距离越小越好。 CD是一种用于衡量两个点云之间相似度的常用几何评价指标。它计算一个点云中每个点到另一个点云的…