苍穹外卖项目中jwt令牌校验的时候, server层需要获得jwt令牌中的EMP_ID,这时候使用线程,为什么?如果不使用线程能传入id吗
在苍穹外卖项目中,在增加员工时要记录创建人id和修改人的id,使用JWT令牌校验时,server
层需要从JWT令牌中获取EMP_ID
,通常会借助线程来实现。以下是原因分析以及是否可以不使用线程传入ID
的讨论:
1. 为什么使用线程?
在JWT校验过程中,EMP_ID
通常是从JWT令牌中解析出来的,而JWT校验一般是在拦截器或过滤器中完成的。为了在server
层中能够方便地获取EMP_ID
,通常会将其存储到当前线程的上下文中(如ThreadLocal
),而不是通过方法参数层层传递。这样做的好处是:
1.1 避免参数传递的复杂性
-
如果每次调用
service
层方法时都需要显式传入EMP_ID
,会导致代码冗余,尤其是在多层调用时,参数传递会变得非常繁琐。 -
使用线程上下文(如
ThreadLocal
)可以隐式传递EMP_ID
,简化代码逻辑。
1.2 线程隔离
-
每个请求对应一个独立的线程,将
EMP_ID
存储到当前线程的上下文中,可以确保不同请求之间的数据隔离,避免多线程并发问题。 -
例如,用户A的请求不会获取到用户B的
EMP_ID
。
1.3 符合设计模式
-
这种方式符合“上下文传递”的设计模式,类似于Spring Security中的
SecurityContextHolder
,它将当前用户信息存储到线程上下文中,方便在任意地方获取。
1.4 代码解耦
-
将
EMP_ID
存储到线程上下文中,可以使service
层代码与具体的身份校验逻辑解耦,service
层无需关心EMP_ID
是如何获取的。