gpt4 book ai didi

java - 如何在 Spring Boot 的每个请求中获取当前用户?

转载 作者:行者123 更新时间:2023-12-04 14:52:13 25 4
gpt4 key购买 nike

我想在每个请求中获取用户的用户名以将它们添加到日志文件中。

这是我的解决方案:

首先,我创建了一个 LoggedUserstatic属性(property):

public class LoggedUser {

private static final ThreadLocal<String> userHolder =
new ThreadLocal<>();

public static void logIn(String user) {
userHolder.set(user);
}

public static void logOut() {
userHolder.remove();
}

public static String get() {
return userHolder.get();
}
}

然后我创建了一个支持类来获取用户名:

public interface AuthenticationFacade {
Authentication getAuthentication();
}

@Component
public class AuthenticationFacadeImpl implements AuthenticationFacade {
@Override
public Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}
}

最后,我在我的 Controller 中使用了它们:

    @RestController
public class ResourceController {

Logger logger = LoggerFactory.getLogger(ResourceController.class);

@Autowired
private GenericService userService;
@Autowired
private AuthenticationFacade authenticationFacade;

@RequestMapping(value ="/cities")
public List<RandomCity> getCitiesAndLogWhoIsRequesting(){
loggedUser.logIn(authenticationFacade.getAuthentication().getName());
logger.info(LoggedUser.get()); //Log username
return userService.findAllRandomCities();
}
}

问题是我不想拥有 AuthenticationFacade在每个 @Controller ,如果我有 10000 个 Controller ,例如,这将是很多工作。

你有什么更好的解决方案吗?

最佳答案

该解决方案称为鱼标记。每个像样的日志框架都有这个功能。一些框架称之为 MDC (映射的诊断上下文)。你可以阅读它herehere .

基本思想是使用ThreadLocalInheritableThreadLocal在一个线程中保存几个键值对来跟踪请求。使用日志配置,您可以配置如何在日志条目中打印它。

基本上,您可以编写一个过滤器,您可以在其中从安全上下文中检索用户名并将其放入 MDC忘记它吧。在您的 Controller 中,您只记录与业务逻辑相关的内容。用户名将与时间戳、日志级别等一起打印在日志条目中(根据您的日志配置)。

关于java - 如何在 Spring Boot 的每个请求中获取当前用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52907950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com