第一阶段:

配置数据库、搭建springboot、配置依赖、yml文件、连接前端网站测试等

遇到的最大问题就是版本不兼容,jdk25太新了导致spring和mybatis plus失效,当前修正之后的jdk是21,springboot 3.5.13;

相较于mybatis,plus版省去了很多crud的代码,它提供了较为完整的crud,代码量减少了

1.entity:放和数据库表一模一样的实体类

2.mapper:和数据库打交道,负责增删改查

3.service:写业务逻辑(登录、上传、总结等)

4.controller:对外提供接口,前端/浏览器调用

5.启动类:项目入口,负责扫描所有包

  • Python 侧:完成 “标准化项目结构 + PDF/Word/TXT 解析接口”,验证文档解析功能;
  • Java 侧:完成 “SpringBoot 基础工程 + Python 服务调用工具 + 文档上传接口”,实现 Java→Python 的文件上传 + 解析调用;
  • 链路验证:确保 Java 上传文档→Python 解析→Java 接收结果的全流程通,为第 2 周 “AI 问答、总结” 功能铺路;
  • 准备工作:完成讯飞星火密钥获取、数据库表创建,为后续大模型调用、数据存储做准备。

参数格式不匹配,是前后端 / 微服务调用最常见的错误!

  • Java 发 JSON
  • Python 必须用 Body(...) 接收
  • 不能直接写 question: str

注解的核心作用

  • 控制反转(IoC):将对象的创建和管理交给 Spring 容器
  • 依赖注入(DI):自动注入依赖,无需手动创建和传递
  • 组件扫描:自动发现和注册组件,减少配置
  • 生命周期管理:支持初始化和销毁方法
  • AOP 支持:为横切关注点(如事务、日志)提供支持

1.

@RestController用于前后端分离,主要作用是接收前端请求和返回JSON数据;在当前项目中前端直接拿到数据就能渲染展示,不用跳页面

@Controller返回的是页面,老项目用

2.

相比于@Autowired (Spring)、@Resource(java)注入依赖,用@RequiredArgsConstructor (Lombok)更干净更推荐,但是要在要注入依赖的对象前面加上final,这也更安全保证对象不会被篡改;对于通过配置类手动注册的组件(如拦截器、过滤器等),使用显式构造函数时最直接和可靠的方式,确保依赖能够正确传递

3.

在编写代码的时候要做到解耦和划清职责,controller层只负责接收前端请求和返回后端数据,service层编写核心逻辑,mapper层连接数据库并执行SQL语句,各区域要分工明确

4.

实体类要对应数据库表的字段;service层有接口,也有接口的实现类,接口只写方法名不写方法体,实现类里面才是service层的核心逻辑代码,这样符合java设计原则:面向接口编程;好处有:解耦,方便测试维护、方法替换实现,接口不用动、规范统一

5.

@Slf4j 是Lombok提供的注解,可自动生成日志对象,在编译时自动为这个类生成一个名为log的日志对象,可直接使用log.info()、log.error()等方法记录日志

@Service 是spring框架提供的注解,用来标识这是一个服务层组件

  • 将此类标记为Spring容器中的一个Bean
  • 使Spring能够自动扫描并管理这个类的实例
  • 符合Spring的分层架构理念(Controller层、Service层、Repository层)

@Value 是spring框架提供的一个注解,用于从配置文件(如application.properties或application.yml)中获取值并注入到类的字段中

  • 集中管理配置:所有配置项集中在配置文件中,便于统一管理
  • 环境隔离:不同环境(开发、测试、生产)可以使用不同的配置文件
  • 代码简洁:无需编写读取配置文件的代码,Spring 会自动处理

@DataLombok提供的注解,可省略getter和setter

6.

HttpResponse是hutool工具库提供的HTTP客户端工具类,在java后端和python服务之间需要通过HTTP协议进行通信

MultipartFile是spring框架提供的一个接口,用于处理HTTP请求中的文件上传,它封装了上传文件的信息操作方法,是spring中处理文件上传的标准方式

7.

在项目中没有写@ComponentScan是因为在启动类那添加了@SpringBootApplication注解,它包含了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan,其中@ComponentScan能扫描启动类及其子包下spring组件,包括@Service、@Controller、@Component等等,但是我在项目里连接数据库层的用的是@Mapper,这是mybatis提供的,所有它无法被@SpringBootApplication扫描,所以还得写个@MapperScan

8.

在项目中原本在controller层还有异常处理的代码没有抽离出来,现在通过声明式异常处理控制器类@RestControllerAdvice来进行全局异常处理,新建了BusinessException类(继承RuntimeException)和GlobalExceptionHandler类用来统一处理异常,解耦controller层;@RestControllerAdvice=@ControllerAdvice+@ResponseBody,因此代码能更简洁

9.

要避免硬编码,可以将jwt里面的secret密钥、expiration过期时间配置到yml里,提高了代码的可维护性,在项目上线前还需把secret替换成更安全的随机字符串

10.

在yml的mybatis-plus设置block-attack-enable:ture,能防止全表更新和删除,虽然项目中删除和更新几乎都是通过id等进行操作,可以避免全表操作,但是加了这个不会有坏处,建议以后项目都加上

11.

对ai接口实现了异步处理,@Async搭配CompletableFuture可获取异步处理的结果;在AsyncConfig配置类里使用spring提供的ThreadPoolTaskExecutor来自定义线程池和管理异步任务的执行;项目里在调用ai时采用了异步接口,但异步长时间耗时AI任务+SpringSecurity会丢失登录上下文导致返回用户未登录,主线程提前401,最终通过开启异步、共享安全上下文、主线程等待异步结果(join)等解决了问题

12.

  • filter 过滤器:负责 全局、安全、认证、跨域、请求入口拦截   JWT、登录校验、权限、防攻击 → 用 Filter
  •  Interceptor 拦截器:负责 业务、日志、接口自定义增强    操作日志、接口统计、业务判断 → 用拦截器

在项目中原来的jwt是自定义的拦截器,由于需要securityconfig实现密码加盐,所以直接把jwt也放进springsecurity,而它是基于Filter设计的,所以此时jwt变成filter配合security合并,并且拦截器是在请求走完Filter、进入spring之后才执行,只拦截Controller层接口,执行时机太晚,而Filter是在最前面执行的

执行顺序:        Filter(包含Security) → Interceptor → Controller

  • 业务小功能:拦截器更好、更简单
  • 安全、认证、全局拦截:过滤器更强、更合理、官方标准
  • 现在要配合 SpringSecurity 做 JWT 必须用 Filter,不能用拦截器

关闭CSRF,由于项目是前后端分离、用jwt做登录、接口供第三方调用,所以要在SecurityConfig里关闭

  • 看登录方式

    • JWT/Token关 CSRF
    • Session/Cookie开 CSRF
  • 看项目类型

    • 前后端分离
    • 后端渲染页面

13.

使用hutool工具库替代Spring的RestTemplate实现第三方AI接口调用,原生ResrTemplate需要手动创建配置类、注入bean相对冗余

14.

使用双层token(accessToken + refreshToken),accessToken只有30分钟有效期保证泄露时间短,refreshToken有效期7天,在这7天内用户无需再次登录保证体验,配合前端自动刷新可以做到7天内用户无需再次登录,双层token机制在安全性和用户体验之间找到完美平衡;

accessToken存储位置:前端本地(localStorage),因为验证它时不需要查数据库或redis

refreshToken存储位置:前端 + redis;   原因1:因为要实现主动失效功能,例如用户修改密码、登出、账户被锁定时需要立即失效token,这样即使旧的accessToken还没过期也无法获取新的accessToken,最多就30分钟泄露的时间,大大降低风险;   原因2:防止refreshToken被重复使用,refreshToken是一次性用的,刷新token验证成功后立即删除旧的refreshToken并生成和存储新的refreshToken,即使被泄露也只能用一次

方案 安全性 用户体验
只用一个长有效期 Token 低(泄露后危害大) 好(长时间不用登录)
只用一个短有效期 Token 差(频繁登录)
双层 Token

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐