异步操作不管是用多线程实现还是用CompletableFuture.runAsync实现,都会出现丢失上下文,导致后续业务逻辑获取不到登录人或者token信息的情况。针对不同情况使用不同解决方式:
1、管理型平台,有登录操作,使用SpringSecurity实现权限控制的,如下:
//异步之前获取上下文
SecurityContext securityContext = SecurityContextHolder.getContext();
//异步发起测算
CompletableFuture.runAsync(() -> {
try {
//上下文重新赋值,保证后续逻辑可以使用
SecurityContextHolder.setContext(securityContext);
//todo 业务逻辑调用
} catch (Exception e) {
e.printStackTrace();
} finally {
//最终清理
SecurityContextHolder.clearContext();
}
});
2、API型项目,无登录操作,只对接口做认证的,使用springBoot或MVC,如下:
//异步之前获取上下文
RequestAttributes attributes = RequestContextHolder.getContext();
//异步发起测算
CompletableFuture.runAsync(() -> {
try {
//上下文重新赋值,保证后续逻辑可以使用
RequestContextHolder.setRequestAttributes(attributes);
//todo 业务逻辑调用
} catch (Exception e) {
e.printStackTrace();
} finally {
//最终清理
RequestContextHolder.resetRequestAttributes();
}
});