技术栈:SpringBoot + MyBatisPlus
遇到的问题以及处理细节点:
-
在处理返回博客信息的时候,通常不需要返回整个博客的信息
BlogInfo类,只需要提供部分有用的信息返回给前端,故新建一个BlogInfoResponse类,也有利于数据安全-
在
BlogInfo转换成BlogInfoResponse类时,用到对象的.stream()流,用.map()方法匹配,再将stream流转换为列表// 获取博客信息 将BlogInfo转换成BlogInfoResponse 提取部分博客的信息显示返回前端 Stream<BlogInfoResponse> stream = blogInfos.stream().map(blogInfo -> { BlogInfoResponse blogInfoResponse = new BlogInfoResponse(); BeanUtils.copyProperties(blogInfos, blogInfoResponse); return blogInfoResponse; }); // 再把流转换成List // return stream.collect(Collectors.toList()); 返回的列表可修改 return stream.toList(); // 返回的列表不可修改,安全性更高上课时候,老师对转换为列表的处理是
stream.collect(Collectors.toList()),它返回的是一个可修改的列表,大多数实现返回ArrayList,官方文档指出:它不保证返回 List 的类型、可变性、可序列化性或线程安全性。如果下游代码修改了这个集合(如list.add()),不会报错,这在多线程或需保持数据纯净的场景下可能是隐患stream.toList():返回是不可变的列表,如果尝试调用如list.add(),则会直接抛出异常。在不需要后续修改列表的场景下,优先选择stream.toList()。它不仅语法简洁,而且提供了更强的内存效率和数据安全性! -
执行流程:
-
-
实现登录的两种模式
-
使用Session:Session持久化——Spring Session 持久化.pdf
- 存储到MySQL
- 存储到Redis
-
不使用Session:JWT令牌
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-impl --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --> <version>0.11.5</version> <scope>runtime</scope> </dependency>
-
-
参数校验工具——Jakarta Validation:支持声明式、基于注释的数据验证
引入依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> -
加密(MD5)