OpenAPI3 + Knife4jSpringBoot3 + OpenAPI3
在Spring Boot 3中,由于不再支持Springfox,你需要调整你的继承库。推荐使用springdoc-openapi作为替代方案,它是一个现代化的OpenAPI 3文档生成工具,与Spring Boot很好地集成。
使用OpenAPI3只需确保你的依赖和配置正确,即可成功使用。
OpenAPI3相关依赖
123456789101112<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <v ...
响应包装类响应包装类(Response Wrapper)是一种设计模式,旨在为API提供一致和结构化的响应格式。这种类通常用于标准化服务器端应用程序与客户端之间的通信,确保所有的API响应都包含必要的元数据和数据内容。
说得通俗点就是把我们后端返回的数据处理一下,让他看起来规范一点,以便于前端处理数据。
123456789101112@PostMapping("/users")public List<User> select() { ... return userList;}@DeleteMapping("/users/{id}")public void deleteUserById(@PathVariable long id) { ...}...
这段代码中,每个返回值都不同。如果不进行包装而直接返回给前端,前端处理起来会很困难。
这时我们可以设置响应包装类
基础/入门响应包装类
123456789101112131415161718192 ...
静态常量类常量接口(Constant Interface)是指一个接口,其中仅包含常量的声明。常量接口中的所有字段默认都是 public static final 的,即它们是公共的、静态的、最终的常量。这种接口的主要目的是为了将常量集中管理,以便在项目中的多个地方使用这些常量时,能够统一修改和管理。
常量接口的定义下面是一个简单的常量接口的示例:
12345678910111213141516171819202122package camellia.constant;/** * @Datetime: 2024/7/11 下午3:34 * @Author: Camellia.xioahua */public interface UserConstant { /** * 用户登入态键 */ String USER_LOGIN_STATE = "userLoginState"; /** * 普通用户权限 */ int DEFAULT_ROLE = 0; /** * 管理员用户权限 * ...
封装请求参数将请求参数封装成用户请求体是一个常见的操作,尤其是在开发 RESTful API 时。这种方式不仅可以让代码更加简洁、可读性更强,还能方便参数的验证和处理。
如果前端发来的请求有很多参数,此时一一个传入就显得很麻烦。我们可以将参数封装成一个类,然后将对象传入。
注意: 请求参数要加注解@RequestBody
示例代码12345678POST http://localhost:8080/users/loginContent-Type: application/json{ "userAccount": "Camelliaxiao", "userPassword": "24211camellia"}
123456789@PostMapping("login")public User userLogin(@RequestBody UserLoginRequest userLoginRequest) { log.info(&quo ...
用户信息脱敏用户信息脱敏是指在显示或存储用户敏感信息时,采取措施保护用户隐私,常见的方法包括:
隐藏部分信息: 将敏感信息的部分字符替换为特定字符或省略号,例如将手机号码中间几位替换为星号。
示例:将手机号码13812345678脱敏为138****5678。
加密: 使用加密算法对敏感信息进行加密,确保只有授权的人员可以解密和查看原始信息。
示例:对用户的密码信息进行加密存储,如使用MD5、SHA等哈希算法加密密码。
数据最小化原则: 仅在必要时处理和存储敏感信息,并且尽可能减少敏感信息的传输和暴露。
示例代码用户登入成功的时需要向前端返回用户的信息以展示,但是所有信息都要返回吗?
NO,像用户密码之类的敏感信息就不能返回,即使进行了加密处理。
那如何处理呢?
可以创建一个新的对象,将不敏感的信息传入,然后返回新的对象。
对于密码要在存入数据库的时候进行加密。
1234567891011User user = new User();// 查询操作...//用户脱敏User safetyUser = new User();safetyUser.setUsername( ...
Tips
未读*用户登录流程及会话管理详解
连接服务器后端,得到一个 session 返回给前端:
用户在前端(浏览器)输入登录信息(如用户名和密码)。
前端将登录信息发送到后端服务器进行验证。
登录成功后,得到成功登录的 session,返回给前端一个设置 cookie 的命令:
服务器验证用户的登录信息(通常通过数据库查询)。
验证成功后,服务器创建一个新的 session 并将用户信息存储在 session 中。
服务器将 session ID 发送回前端,通常通过设置 HTTP 响应头中的 Set-Cookie。
前端接收到后端命令,设置 cookie,保存到浏览器中:
浏览器接收到服务器的响应,并自动将 session ID 存储在 cookie 中。
这可以通过 document.cookie 或者浏览器的内置功能来实现。
前端再次请求后端的时候(相同域名),在请求头上带上 cookie 去请求:
浏览器在后续的请求中,会自动将 cookie 中的 session ID 发送到服务器。
这由浏览器自动处理,开发者无需手动设置。
后端拿到前端传来的 cookie,找 ...
JWT令牌1. 什么是JWT令牌JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。它主要由三部分组成,通过点号(.)分隔:
Header(头部):包含令牌的类型(即JWT)和使用的签名算法(例如HMAC SHA256或RSA)。
Payload(载荷):包含令牌的声明(claim),即实际传输的信息,例如用户ID、角色、权限等。
Signature(签名):用于验证发送方是否有权创建令牌,确保信息未被篡改。
JWT的工作流程通常如下:
生成令牌:在用户身份验证成功后,服务器根据用户信息和配置生成一个JWT,并将其发送给客户端。
验证令牌:客户端收到JWT后,可以存储在本地并在未来的API请求中发送该令牌。
使用令牌:服务端收到JWT后,会验证签名,解析载荷中的信息,并根据需要做出响应。
JWT的优点包括:
无状态:服务器不需要在内存中存储会话信息,每个请求都包含足够的信息来验证用户。
可扩展性:因为JWT可以包含任何JSON数据,因此非常适合于传输各种类型的信息。
安全性:JWT可以使用密钥进行签名,确 ...
密码加密开发中使用明文将密码存入数据库是一个很可怕的事,这直接暴露在开发人员的面前。所以要对存入数据库的密码进行加密,加密密码可以防止未经授权的访问者或攻击者轻易获取用户的明文密码。即使数据库被入侵或泄露,加密后的密码也不会直接暴露用户的真实密码。
这里将介绍三种加密方式
使用MD5 算法进行加密1. 使用 MessageDigest 类来计算字符串的 MD5 摘要这个方法不太友好,可以了解一下。
123456789101112131415161718192021222324252627282930313233343536/** * 测试使用 MD5 算法进行摘要计算。 * * @throws NoSuchAlgorithmException 如果指定的算法(MD5)不可用时抛出此异常 */@Testvoid testDigest() throws NoSuchAlgorithmException { // 获取 MD5 摘要算法的实例 MessageDigest md5 = MessageDigest.getInstance("MD5"); ...
Tips
未读性能:语句顺序影响性能假如现在有三个条件语句,其中有两个只是简单的逻辑判断,但是最后一个语句判读涉及SQL。三个语句若有任何有个不成立都立即返回,如何排序才能性能最佳?
应该将涉及SQL的if语句放最后执行,因为如果前面不通过就返回了,不用在执行性能消耗最大的SQL。如果放在前面,倘若没问题据判断后面的简单逻辑,每次都要判断消耗性能。
示例:
1234567891011121314151617181920212223242526//1.校验if(StringUtils.isAnyBlank(userAccount, userPassword, checkPassword)) { return -1L;}if(userAccount.length()<4) return -1L;if (userPassword.length()<8) return -1L;//校验账户不能包含特殊字符,定义只能包含字母、数字和下划线的正则表达式。String validPattern = "^[a-zA-Z0-9_]+$";Matcher m ...
用户名合法判断在开发中经常设计用户名是否合法判断,判断的规则基本一致,采用正则进行判断。
示例代码:
123456789101112131415161718192021222324import java.util.regex.Pattern;public class AccountValidation { public static boolean isValidAccount(String account) { // 定义只能包含字母、数字和下划线的正则表达式 String regex = "^[a-zA-Z0-9_]+$"; // 编译正则表达式为 Pattern 对象 Pattern pattern = Pattern.compile(regex); // 使用 Pattern 对象匹配账户名 return pattern.matcher(account).matches(); } public static void main( ...