Springboot项目搭建(2)-用户详细信息查询
1. 提要信息
1.1 java四类八种
在Java中,四类指的是Java中的基本数据类型和引用数据类型:
- 基本数据类型:Java提供了八种基本数据类型,包括整数型、浮点型、字符型和布尔型。
- 引用数据类型:指向对象的引用,如类、接口、数组等。
- 特殊数据类型:包括void类型和null类型。
- 复合数据类型:由基本数据类型和其他类型组合而成的类型,如数组。
八种则是指Java中的基本数据类型:
- int:32位整数,范围是-2^31到2^31-1。
- short:16位整数,范围是-2^15到2^15-1。
- long:64位整数,范围是-2^63到2^63-1,需要在数字后加上L或l。
- byte:8位整数,范围是-128到127。
- float:32位浮点数,用于表示小数。
- double:64位浮点数,精度比float高。
- char:16位Unicode字符。
- boolean:只有两个值,true和false。
1.2 什么是请求头信息
请求头信息(Request Headers)是在HTTP请求中,客户端向服务器发送的一系列键值对,它们提供了关于请求本身的信息,以及客户端环境和请求体的附加信息。请求头信息可以帮助服务器更好地理解请求的上下文,并据此做出适当的响应。常见的请求头信息有:Host、User-Agent、Accept等。
1.3 get与post请求的区别
POST:适合发送大量数据和任意类型的数据,不受字符类型限制。
GET:适合发送少量数据,且数据需要被编码为URL有效的格式。虽然理论上可以发送任何类型的数据,但实际应用中通常用于发送简单的查询参数。
1.4 请描述重载和重写的区别
重载:指的是在一个类中可以定义多个同名方法,只要这些方法的参数列表不同(参数的类型、数量或者顺序不同)。重载方法可以有不同的返回类型,也可以没有返回类型,但它们的参数列表必须不同。
重写:指的是在子类中重新定义父类的方法。重写的方法必须有相同的方法名、参数列表和返回类型。如果父类的方法被声明为final
,则不能被重写。
1.5 创建控制器类常用三种方式
1.实现Controller接口,需要实现方法完成业务操作,有局限性
2.使用@Controller注解,可以创建多个方法,方法上设置RequestMapping访问地址,响应数据格式需要自定义,尤其JSON支持不是很完整
3.使用@RestControl注解,支持Rest请求方式,内置了ResponseBody可以自动转换JSON
1.6 方法&函数
方法的定义格式:
访问权限限定符,返回类型 方法名称(参数列表){ 方法体;}
例:
public int addNumbers(int num1, int num2) {
int sum = num1 + num2;
return sum;
}
共同点:
- 都可以传递参数、都有返回值
- 都是用于执行一个过程
不同点:
- 函数通常是单独创建并被调用,不需要前置条件,如:自定义四舍五入
- 方法是类成员,通常情况需要使用类对象调用,在JAVA中只有方法,没有函数。
2.令牌验证ArticleController
2.1 定义
书接上回,文章结尾11.JWT令牌
我使用了"login"登录方法处理用户登录请求。它接收用户名和密码,验证用户信息,并在验证成功后生成一个JWT令牌。
下面将使用"list"方法处理获取用户信息的请求。它接收上方生成的JWT令牌,验证令牌的有效性,并根据令牌中的信息查询用户信息(若令牌有效则给予放行,反之拒绝访问)。
2.2 令牌的生成与验证
login
方法生成的JWT令牌在list
方法中被验证。这是两个方法之间的直接关联。
login
方法负责生成令牌,而list
方法负责验证令牌的有效性。
login
方法通过用户名和密码验证用户身份,而list
方法通过验证JWT令牌来确认用户的身份。
2.3 具体操作
文件地址:org/example/controller/ArticleController.java
@RequestHeader:获取请求头信息
package org.example.controller;import jakarta.servlet.http.HttpServletResponse;
import org.example.entity.Result;
import org.example.utils.JwtUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/article")
public class ArticleController {@RequestMapping("/list")public Result<String> list(@RequestHeader(name = "Authorization")String token, HttpServletResponse response) {//验证tokentry{Map<String,Object> claims = JwtUtil.parseToken(token);return Result.success("查询所有文章列表");}catch(Exception e){response.setStatus(401);//设置响应状态return Result.error("未登录");}}
}
2.4 效果演示
3.拦截器
3.1 定义
功能:接收并拦截所有的请求
1.过程中检查用户是否已经登录,以及是否拥有执行特定操作的权限。
2.在请求到达具体的业务逻辑处理之前,拦截器可以对请求数据进行预处理,如验证、格式化或转换。
3.2 函数操作LoginInterceptor
在example下创建org/example/interceptors/LoginInterceptor.java
拦截器的功能方法:
- request 请求对象,客户端向服务器发送的数据包
- response响应对象,服务端向客户端传递数据,发送的数据包
- handler 头协议对象,请求协议
package org.example.interceptors;
//登录拦截器
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.utils.JwtUtil;
import org.example.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
@Component //由Spring框架,注册拦截器
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);//拿到令牌后,给予放行return true;}catch (Exception e){response.setStatus(401);return false;}}
}
3.3 拦截器的注册WebConfig
在example下创建org/example/config/WebConfig.java
在启动NewsApplication.java后,优先加载该文件。
他是工程的一个配置类,主要作用是拦截器的使用,服务于用户首页。
package org.example.config;
import org.example.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration //工程启动即加载
public class WebConfig implements WebMvcConfigurer {@Autowired //获得拦截器工具private LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//登录接口、注册接口不拦截//excludePathPatterns不拦截方法registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");}
}
3.4 返回ArticleController
既已配置了开局启动项目,那么在后续的操作中便不必反复验证。
更改后的org/example/controller/ArticleController.java代码:
package org.example.controller;
import jakarta.servlet.http.HttpServletResponse;
import org.example.entity.Result;
import org.example.utils.JwtUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/article")
public class ArticleController {@RequestMapping("/list")public Result<String> list() {//验证tokenreturn Result.success("所有文章数据");}
}
4.获取用户详细信息:
1.控制层中编写方法userinfo 2.service和mapper中,根据用户指令查询信息【已配置】
4.1 定义请求方法UserController
在org/example/controller/UserController.java中
定义了一个处理HTTP POST请求的方法userInfo
, 返回类型是Result,
并获取token值(token中装着用户名信息)。
//详细信息@PostMapping("/userinfo")public Result<User> userInfo(@RequestHeader(name = "Authorization")String token){//从令牌中获得用户名Map<String,Object> map = JwtUtil.parseToken(token);String username = (String)map.get("username");//将获取的用户名转换成String字符串//查询用户对应的信息User user = userService.findUserByUsername(username);return Result.success(user);}
4.2 配置忽略密码User
在org/example/entity/User.java中找到想要隐藏的项
在其上方设置忽略属性(密码为例):
@JsonIgnore:配置springmvc把当前对象转换成json字符串的时候忽略password
@JsonIgnore
private String password;
4.3 配置命名转换
数据库中的列名为下划线间隔,实体映射类中的命名为驼峰命名。
针对这种无法匹配的情况,在/resources/application.yml中配置自动命名转换。
mybatis:
configuration:
map-underscore-to-camel-case: true
4.4 ThreadLocal本地线程
作用:确保数据不会混淆
4.4.1 线程测试
在"test"下新建类:src/test/java/ThreadLocalTest.java
import org.junit.jupiter.api.Test;
public class ThreadLocalTest {@Testvoid testThreadLocalSetAndGet() {//创建线程池,用于存放用户信息ThreadLocal tl = new ThreadLocal();new Thread(() -> {tl.set("Adela"); //在线程池中创建一个线程System.out.println(Thread.currentThread().getName()+":"+tl.get());System.out.println(Thread.currentThread().getName()+":"+tl.get());System.out.println(Thread.currentThread().getName()+":"+tl.get());},"蓝色").start();new Thread(() -> {tl.set("Hela"); //在线程池中再创建一个线程System.out.println(Thread.currentThread().getName()+":"+tl.get());System.out.println(Thread.currentThread().getName()+":"+tl.get());System.out.println(Thread.currentThread().getName()+":"+tl.get());},"黑色").start();}
}
4.4.2 导入线程功能
于网络查找线程功能代码,放在org/example/utils/ThreadLocalUtil.java中
package org.example.utils;
import java.util.HashMap;
import java.util.Map;
@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.4.3 线程应用
返回org/example/interceptors/LoginInterceptor.java,把拦截到的数据,给到线程池中。
package org.example.interceptors;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.example.utils.JwtUtil;
import org.example.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
@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 {//清除线程中的数据ThreadLocalUtil.remove();}👆
}
相关文章:

Springboot项目搭建(2)-用户详细信息查询
1. 提要信息 1.1 java四类八种 在Java中,四类指的是Java中的基本数据类型和引用数据类型: 基本数据类型:Java提供了八种基本数据类型,包括整数型、浮点型、字符型和布尔型。引用数据类型:指向对象的引用,…...

Stable Diffusion的加噪和去噪详解
SD模型原理: Stable Diffusion概要讲解Stable diffusion详细讲解Stable Diffusion的加噪和去噪详解Diffusion ModelStable Diffusion核心网络结构——VAEStable Diffusion核心网络结构——CLIP Text EncoderStable Diffusion核心网络结构——U-NetStable Diffusion中…...
解决 Gradle 报错:`Plugin with id ‘maven‘ not found` 在 SDK 开发中的问题
在 SDK 开发过程中,使用 Gradle 构建和发布 SDK 是常见的任务。在将 SDK 发布为 AAR 或 JAR 包时,你可能会使用 apply plugin: maven 来发布到本地或远程的 Maven 仓库。但是,随着 Gradle 版本的更新,特别是从 Gradle 7 版本开始&…...

EMD-KPCA-Transformer多变量回归预测!分解+降维+预测!多重创新!直接写核心!
EMD-KPCA-Transformer多变量回归预测!分解降维预测!多重创新!直接写核心! 目录 EMD-KPCA-Transformer多变量回归预测!分解降维预测!多重创新!直接写核心!效果一览基本介绍程序设计参…...
前端 px、rpx、em、rem、vh、vw计量单位的区别
目录 一、px 二、rpx 三、em 四、rem 五、vh和vw 六、rpx 和 px之间的区别 七、px 与 rem 的区别 一、px px(像素): 1、相对单位,代表屏幕上的一个基本单位,逻辑像素。 2、不会根据屏幕尺寸或分辨率自动调整大…...
OceanBase数据库产品与工具介绍
OceanBase:蚂蚁集团自主研发的分布式关系数据库 1、什么是 OceanBase? OceanBase 是由蚂蚁集团完全自主研发的企业级分布式关系数据库,始创于 2010 年。它具有以下核心特点: 数据强一致性:在分布式架构下确保数据强…...

学习threejs,对模型多个动画切换展示
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.AnimationMixer 动画…...

【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:本文面向的人群 二:错误场景引入 三:正确场景引入 四…...

Python爬虫:如何从1688阿里巴巴获取公司信息
在当今的数字化时代,数据已成为企业决策和市场分析的重要资产。对于市场研究人员和企业分析师来说,能够快速获取和分析大量数据至关重要。阿里巴巴的1688.com作为中国最大的B2B电子商务平台之一,拥有海量的企业档案和产品信息。本文将介绍如何…...

单片机学习笔记 2. LED灯闪烁
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯 目录 0、实现的功能 1、Keil工程 2、代码实现 0、实现的功能 LED灯闪烁 1、Keil工程 闪烁原理:需要进行软件延时达到人眼能分辨出来的效果。常用的延时方法有软件延时和定时器延时。此次先进行软…...

折叠光腔衰荡高反射率测量技术的matlab模拟理论分析
折叠光腔衰荡高反射率测量技术的matlab模拟理论分析 1. 前言2. 光腔模型3. 光腔衰荡过程4. 衰荡时间与反射率的关系5. 测量步骤①. 光腔调节:②. 光腔衰荡测量:③. 计算衰荡时间常数:④. 反射率计算: 6. 实际应用中的调整7. 技术优…...

ubuntu 16.04 中 VS2019 跨平台开发环境配置
su 是 “switch user” 的缩写,表示从当前用户切换到另一个用户。 sudo 是 “superuser do” 的缩写,意为“以超级用户身份执行”。 apt 是 “Advanced Package Tool” 的缩写,Ubuntu中用于软件包管理的命令行工具。 1、为 root 用户设置密码…...

C语言第13节:指针(3)
1. 回调函数 回调函数的基本思想是,将函数指针作为参数传递给另一个函数,并在需要时通过这个函数指针调用对应的函数。这种方式允许一个函数对执行的内容进行控制,而不需要知道具体的实现细节。 回调函数在以下场景中尤为有用: …...
java:简单小练习,面积
面积:圆和长方形 接口:实现面积 test:调用 一、interface: 对于接口,它是Java中一个新增的知识点,而C中没有,因为Java有一个缺陷就是不可以实现多继承,只可以单继承,这就限制了有些功能的使…...

@Autowired 和 @Resource思考(注入redisTemplate时发现一些奇怪的现象)
1. 前置知识 Configuration public class RedisConfig {Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template new RedisTemplate<>();template.setConnectionFactory(facto…...
PostgreSQL提取JSON格式的数据(包含提取list指定索引数据)
PostgreSQL提取JSON格式的数据(包含提取list指定索引数据) ->>, ->, #>, #>> 在PostgreSQL中,处理json或jsonb类型数据时,->>, ->, #> 和 #>> 是非常有用的操作符,它们允许你以…...

如何利用谷歌浏览器提高网络安全
在当今数字化时代,网络安全已成为我们不可忽视的重要议题。作为全球最受欢迎的网络浏览器之一,谷歌浏览器不仅提供了快速、便捷的浏览体验,还内置了多种安全功能来保护用户的在线安全。本文将详细介绍如何通过谷歌浏览器提高您的网络安全&…...

go-zero(四) 错误处理(统一响应信息)
go-zero 错误处理(统一响应信息) 在实现注册逻辑时,尝试重复注册可能会返回 400 状态码,显然不符合正常设计思维。我们希望状态码为 200,并在响应中返回错误信息。 一、使用第三方库 1.下载库 目前 go-zero官方的…...
1.1 爬虫的一些知识(大模型提供语料)
1.1 爬虫的一些知识(大模型提供语料) 网页资源: 资源组织方式:列表分页,搜索引擎,推荐 发送请求的文档类型:html ,js 响应请求的文档类型:html,js,json 请求方式:同步和异步 页面形式…...

Linux开发工具:Vim 与 gcc,打造高效编程的魔法双剑
文章目录 一、初识Vim模式 二、vim基本操作2.1基础操作2.2命令模式/正常模式2.2.1光标定位2.2.2复制粘贴、删除2.2.3撤销2.2.4替换字符2.2.5替换模式 2.3底行模式2.3.1退出vim和**保存文件**2.3.2定位文本字符串2.3.3命令2.3.4实现分屏2.3.5替换指定字符串 2.4补充指令2.4.1视图…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...