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

embedded/2024/10/20 6:20:18/
  • 接着学习。之前的博客的进度:完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、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类中

postman%E5%BC%80%E5%A7%8B%E6%B5%8B%E8%AF%95%E3%80%82-toc" style="margin-left:120px;">(2)重启工程。回到postman开始测试。

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

postman%E4%B8%AD%E6%B5%8B%E8%AF%95%E6%97%B6%EF%BC%8C%E9%9B%86%E5%90%88(Collections)%E4%B8%80%E4%B8%8B%E7%9A%84%E6%89%80%E6%9C%89%E6%8E%A5%E5%8F%A3%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%BB%9F%E4%B8%80%E6%B7%BB%E5%8A%A0%E7%9B%B8%E5%90%8C%E8%AF%B7%E6%B1%82%E5%A4%B4%E3%80%82-toc" style="margin-left:160px;">(II)postman中测试时,集合(Collections)一下的所有接口都可以统一添加相同请求头。

(3)问题与解决

mybatis%E2%80%9C%E5%BC%80%E5%90%AF%E9%A9%BC%E5%B3%B0%E5%91%BD%E5%90%8D%E2%80%94%E2%80%94%3E%E4%B8%8B%E5%88%92%E7%BA%BF%E5%91%BD%E5%90%8D%E7%9A%84%E8%87%AA%E5%8A%A8%E8%BD%AC%E6%8D%A2%E2%80%9D%E3%80%82-toc" style="margin-left:120px;">.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令牌工具类
java">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);}
}

java">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类型的。
java">@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);}
postman%E5%BC%80%E5%A7%8B%E6%B5%8B%E8%AF%95%E3%80%82">(2)重启工程。回到postman开始测试。
(I)测试结果。请求成功!


postman%E4%B8%AD%E6%B5%8B%E8%AF%95%E6%97%B6%EF%BC%8C%E9%9B%86%E5%90%88(Collections)%E4%B8%80%E4%B8%8B%E7%9A%84%E6%89%80%E6%9C%89%E6%8E%A5%E5%8F%A3%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%BB%9F%E4%B8%80%E6%B7%BB%E5%8A%A0%E7%9B%B8%E5%90%8C%E8%AF%B7%E6%B1%82%E5%A4%B4%E3%80%82">(II)postman中测试时,集合(Collections)一下的所有接口都可以统一添加相同请求头。
  • 因为在postman测试时,请求头的参数与值总是每个都要重新写,很麻烦。
  • 可以直接去集合然后点击Scripts——>"Pre-request"(请求前的一个脚本)。

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

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

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

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

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

  • 因为数据库里面的命名是以下划线命名,而实体类User中的变量是驼峰命名。这时候mybatis不知道咋去封装数据。
  • mybatis%E2%80%9C%E5%BC%80%E5%90%AF%E9%A9%BC%E5%B3%B0%E5%91%BD%E5%90%8D%E2%80%94%E2%80%94%3E%E4%B8%8B%E5%88%92%E7%BA%BF%E5%91%BD%E5%90%8D%E7%9A%84%E8%87%AA%E5%8A%A8%E8%BD%AC%E6%8D%A2%E2%80%9D%E3%80%82">.yml配置文件中配置mybatis“开启驼峰命名——>下划线命名的自动转换”。

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

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

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


http://www.ppmy.cn/embedded/119999.html

相关文章

鸿蒙-app进入最近任务列表触发的监听

如果在UIAbility中&#xff0c;参考第一个链接&#xff0c;在页面中参考如下&#xff1a;State windowStage: window.WindowStage (getContext(this) as common.UIAbilityContext).windowStagetry {this.windowStage.on(windowStageEvent, (data) > {// 前台应用进入最近任…

图书系统|图书个性化推荐系统|基于springboot的图书个性化推荐系统设计与实现(源码+数据库+文档)

图书个性化推荐系统目录 目录 基于springboot的图书个性化推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

linux服务器安装原生的php环境

在CentOS上安装原生的PHP环境相对简单。下面是一个详细的步骤指南&#xff0c;适用于CentOS 7及更高版本。 ### 第一步&#xff1a;更新系统 首先&#xff0c;确保你的系统是最新的&#xff1a; sudo yum update -y ### 第二步&#xff1a;安装EPEL和Remi仓库 1. **安装EP…

解决银河麒麟V10系统bash执行提示:无法执行:权限不够的问题

无论是普通用户还是root用户&#xff0c;在银河麒麟桌面版操作系统下运行二进制可执行文件或者.sh文件等&#xff0c;都提示bash无法执行&#xff1a;权限不够&#xff0c;咨询官方客服和网上的结果&#xff0c;总结得到以下几点&#xff1a; 1.麒麟系统kysec的问题 打开左下…

机器学习-TopicModel

概率图模型基础概率潜在语义分析&#xff08;PLSA&#xff09;LDA 概率图模型基础 猜球游戏 有两个信封&#xff0c;其中一个装有一个红球&#xff0c;一个黑球。另一个信封有两个黑球。 。 假设红球价值100元&#xff0c;黑球价值1元。 你随机从其中拿起一个信封&#xff0c;从…

xpath在爬虫中的应用、xpath插件的安装及使用

安装 1、打开谷歌浏览器进入扩展程序安装页面(右上角会有"开发者模式按钮")默认是关闭的&#xff0c;当安装此插件时需要把开发者模式打开。 2、下载下来的xpath_helper是zip格式的&#xff0c;需要解压缩即可安装。 3、重启浏览器&#xff0c;再次点击扩展程序即…

ip经过多个服务器转发会网速变慢吗

会的&#xff0c;IP经过多个服务器转发时&#xff0c;网速通常会变慢&#xff0c;主要原因包括&#xff1a; 增加的延迟&#xff1a; 每经过一个服务器&#xff0c;数据包就需要额外的时间进行处理和转发。这种处理时间和网络延迟会累积&#xff0c;导致整体延迟增加。 带宽限制…

FastAPI挂载静态资源

FastAPI挂载静态资源 使用场景&#xff1a;前后端不分离&#xff0c;后端挂载图片&#xff0c;css,js等静态资源&#xff0c;给客户端响应html页面 首先假设项目根目录为app&#xff0c;app目录下的static为存放静态资源的目录 #app/main.py from fastapi import FastAPIapp…