陌生 Java 项目历险记 1 ——跌跌撞撞

915 阅读3分钟

近期由于工作的需要,接手了一个 Java 项目,需要尽快读懂这个项目。

这个项目的文档很少,花了不少时间去部署,但最终我还是把项目运行起来了。 接着,就是阅读代码了。

过往的经验告诉我,阅读代码,首先要找到代码的入口。

令人欣喜的是,Idea 自带了 Spring 插件,打开之后,展示结果如下,所有的入口一目了然。

image.png 工欲善其事,必先利其器。Spring 插件的这个效果,让我信心满满,觉得很快就可以完成这个任务了。

然而,我的乐观心态很快就被打破了。

由于身份验证失败,我无法访问哪怕最简单的 /admin/list 接口。我打在 list 方法处的断点,根本无法执行到!

image.png 面对满屏陌生的 SpringBoot 代码,我一下子茫然了。

总不能让我从 main 方法开始找吧,以 Spring 封装层次之多,那简直就是大海捞针。我突然有点怀疑大学期间 Tomcat 配置 Servlet 的方式了,简单又高效。

吐槽归吐槽,项目还得继续。我只能抱着“先苦后甜”的信念,继续前行。

于是,我去网上学习了一下 Spring Security 的基础知识,之后在项目中找到了一个类似的SecurityConfig。然后在里面找到了一个JwtAuthenticationTokenFilter,并且打了一个断点。

image.png YYDS,这次断点打到了!

然而,高兴了才不到几分钟,新问题出现了,把 doFilterInternal 每行代码都执行一遍,没有任何异常,控制台倒是打了两行日志。

2024-03-28 21:59:41.738 DEBUG 12359 --- [nio-8080-exec-5] c.x.c.DynamicSecurityFilter : Authorized filter invocation [GET /admin/list?pageNum=1&pageSize=5] with attributes [25:user-manager] 
2024-03-28 21:59:46.314 DEBUG 12359 --- [nio-8080-exec-5] c.x.c.DynamicSecurityFilter : Authorized public object filter invocation [GET /error?pageNum=1&pageSize=5]

这是在暗示我异常被吞掉了么!

这也太背了吧,刚开始读代码,就遇到了异常被吞的情况!

如果是私有代码,遇到了异常被吞的情况,是非常麻烦的。但这可是Spring框架啊,其日志体系应该是非常完善的吧。

我试着把所有的日志都改成TRACE级别,然后再执行一次。果然,Spring 没有让我失望,异常打印出来了。

image.png 顺着这个异常,我找到了 ExceptionTranslationFilter,然后在里面找到了异常的相关处理逻辑。

image.png 现在,对于整个流程总算是比较清楚了:

  • JwtAuthenticationTokenFilter 负责生成认证的 AuthenticationToken
  • FilterSecurityInterceptor 负责权限校验
  • ExceptionTranslationFilter 捕获异常,并进行处理

为了搞懂这些内容,最基本的方式就是打断点和看日志。但这些都建立在对框架有个基本的认知之上。

上面这些流程,对于很多 Spring Boot 老手来说,就是再熟悉不过了。但由于我过去没有使用过 SpringBoot,搞懂这些花了我不少时间。

到现在,仍然有两个问题:

  • 异常是 AffirmativeBased 抛出来的,但其具体是怎么个流程,现在还没完全没看明白
  • 异常最后被重定向到 /error 了,这个逻辑是怎么处理的,也还有待研究清楚

引入框架是为了快速解决问题,但学习这些框架本身却得花不少时间,有没有办法快速看懂这些代码的。总不能,让我先去买个课吧!

太累了,下周再研究上面的问题。