JavaEE进阶

博客系统项目

技术栈:SpringBoot + MyBatisPlus

遇到的问题以及处理细节点:

  1. 在处理返回博客信息的时候,通常不需要返回整个博客的信息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()。它不仅语法简洁,而且提供了更强的内存效率和数据安全性!

    • 执行流程:

      image

  2. 实现登录的两种模式

    1. 使用Session:Session持久化——Spring Session 持久化.pdf

      • 存储到MySQL
      • 存储到Redis
    2. 不使用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>
      
  3. 参数校验工具——Jakarta Validation:支持声明式、基于注释的数据验证

    引入依赖:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
  4. 加密(MD5)