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

news2024/9/27 17:33:51
  • 接着学习。之前的博客的进度:完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、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.coloradmin.cn/o/2165149.html

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

相关文章

SpringBoot项目编译运行成功,但有些包名类名仍然下划线标红的解决方法 | Idea

目录 问题解决方案&#xff1a;方法一&#xff1a;方法二【我用这个成功的】 问题 如图&#xff0c;成功运行但有些包名类名仍然下划线标红&#xff0c;强迫症抓狂 成功运行&#xff1a; 有些包导入标红&#xff1a; 解决方案&#xff1a; 方法一&#xff1a; 点击fil…

K8S介绍---搭建集群

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

AXI4-Stream

AXI4-Stream 简介信号握手机制字节类型TKEEP和TSTRBAXI4-Stream Data FIFO正常模式packet模式 AXI4-Stream Interconnect 简介 这是一种连续流接口&#xff0c;不需要地址线&#xff08;很像 FIFO &#xff0c;一直读或一直写就行&#xff09;。对于这类 IP &#xff0c;ARM 不…

WebUI密码被锁定

锁定密码 打开-webui/打开-webui 讨论 #1027 (github.com) 当你忘记WebUI密码了

通信工程学习:什么是VPN虚拟专用网络

VPN:虚拟专用网络 VPN(Virtual Private Network),即虚拟专用网络,是一种通过公共网络(如互联网)建立私有网络连接的技术。以下是关于VPN的详细解释: 一、VPN虚拟专用网络的定义与原理 VPN通过公共网络(通常是互联网)建立一个临时的、安全的连接,形…

一维数组在内存中的存储

在之前的文章中&#xff0c;我已经介绍了一维数组的创建和初始化和一维数组的使用&#xff0c;今天我们来深入了解一下一维数组在内存中的存储形式。 首先我们先用代码打出数组元素的地址。 #include <stdio.h> int main() { int arr[8]{1,2,3,4,5,11,6,7,8}; int i0; …

单词记忆的化境:用思想的流水去淹没坚硬的石块

其实&#xff0c;鹅卵石通常都是很硬的。但是河底的石子&#xff0c;几乎大多都成了鹅卵石&#xff0c;它们被流水淹没&#xff0c;日复一日、夜以继日的冲刷着&#xff0c;没有了棱角。 在单词的记忆过程中&#xff0c;我们有太多的人&#xff0c;都有着不堪回首的往事&#x…

HDFS分布式文件系统01-HDFS JAVA操作与联邦机制

HDFS分布式文件系统 参考学习目标第三课时知识点1-HDFS的Java API介绍知识点2-案例-使用Java API操作HDFS 第四课时知识点1-Federation机制的实现原理知识点2-Federation机制的特点知识点3-Federation机制的实现知识点4-Erasure Coding 参考 maven的setting.xml配置文件详解 …

影刀RPA实战:网页爬虫之天猫商品数据

1.实战目标 1.1 实战目标 在电商行业&#xff0c;我们经常爬取各个平台的商品数据&#xff0c;通过收集和分析这些商品数据&#xff0c;企业可以了解市场趋势、消费者偏好和竞争对手的动态&#xff0c;从而制定更有效的市场策略。爬取商品数据对于企业在市场竞争中把握先机、…

招联金融2025校招内推喇

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营…

SD卡读写

SD卡 SD卡分类根据存储容量根据性能 SD卡协议简介SPI 模式命令命令格式命令类别CMDACMD 响应R1R2R3R7 寄存器CSD 总线读操作写操作擦除&写保护 初始化流程 SD 模式 IP 设计IP 例化界面IP 接口IP 状态机IP 验证 雷龙贴片式TF卡参考资料 SD卡分类 根据存储容量 Standard Ca…

五星级可视化页面(26):经常被模仿,从未被的超越的大屏界面。

Hello&#xff0c;各位老铁&#xff0c;本期分享的可视化界面&#xff0c;你可能在某些地方见过&#xff0c;或者被某些设计师临摹过&#xff0c;说明它们足够漂亮了&#xff0c; 你如果仔细观看细节&#xff0c;还是会发现很作出彩的地方不是轻易可以模仿的。 只有创新&#x…

linux网络编程8

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

【智能大数据分析 | 实验一】MapReduce实验:单词计数

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…

dump java内存并进行分析

一、确保机器存在jmap命令 jmap 如果不存在&#xff0c;可以从其他机器将完整的jdk拷贝过来&#xff0c;然后进行使用 二、dump内存 ./jmap -dump:formatb,file./dump.hprof 2853 其中2853是java的PID&#xff0c;将其改为自己想要dump的java进程ID 三、分析&#xff0c;…

系统敏感信息搜索工具(支持Windows、Linux)

目录 工具介绍 使用说明 search模块 browser模块 下载地址 工具介绍 可以快速搜索服务器中的有关username,passsword,账号,口令的敏感信息还有浏览器的账户密码。 使用说明 search模块 searchall64.exe search -p 指定路径 searchall64.exe search -p 指定路径 -s &q…

前缀和(3)_寻找数组的中心下标

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(3)_寻找数组的中心下标 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1…

hackbar 插件安装(google版)

hackbar下载&#xff08;github&#xff09; 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/19 18:17 HackBar 是一个辅助进行网络渗透测试和安全评估的浏览器插件。它提供了一系列快捷工具和功能&#xff0c;可以帮助用户执行各种网络攻击和测试&#xff0c;包括 XS…

Linux宇宙-1

1.Linux的前世今生 1.计算机 根据摩尔定理&#xff0c;计算机快速向小型化和高性能化发展。 计算机私人公司也是蓬勃发展&#xff0c;包括面向企业的大型计算机&#xff1a;IBM&#xff1b;面向个人的计算机&#xff1a;苹果&#xff0c;微软和英特尔&#xff1b; 由于计算…