我在我的Dropwizard应用程序中使用基本身份验证机制,我在其中捕获登录的用户详细信息,如下所示:
@POST
@Timed
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/pdf")
@Path("/")
@RolesAllowed("user,admin")
public Response function(@Auth User user) throws Exception {
//some logic around here
}
现在出于审计目的,我希望在我的应用程序的每一层传递此用户信息,我的意思是在服务,DAO,ExceptionMappers等中,我不想将它作为函数参数传递到任何地方,因为它看起来笨拙并且还具有可维护性开销。所以我的问题是,有没有什么方法可以为每个REST调用或用户会话设置一些全局配置,并可以在任何我想要的地方获取它? 我一直是Ruby用户,因此我们能够做到这样的事情:
Thread.current[:user] = user
每个用户会话都可以访问。
答案 0 :(得分:0)
实现此目的的一种方法是使用Java的ThreadLocal,其中您可以设置User对象,并且该对象将可用于该特定执行程序线程。
将以下内容添加到资源类中。
private static ThreadLocal<User> localUser = new InheritableThreadLocal<>();
public static ShortenerServiceUser getUser() {
return localUser.get();
}
无论何时调用function()方法,只需将User对象设置为ThreadLocal变量即可。
localUser.set(user);
现在,每当您需要从当前线程上下文访问User对象时,您需要做的就是如下
User localUser = YourResource.getUser();
您可以使用ThreadLocal.remove()方法从上下文中清除User对象。