2017-07-28 38 views
0

我使用基本身份验证机制在我Dropwizard的应用程序,在那里我捕获的图像登录的用户信息,这样的事情:传播用户信息中的所有图层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,ExceptionMapper等中,我不想将它作为函数参数传入,因为它看起来很笨拙,并且还具有可维护性开销。所以我的问题是,有没有什么办法可以为每个REST调用或用户会话设置一些全局配置,并可以在任何我想要的位置获取? 我一直是Ruby的用户,并在我们能够做这样的事:

Thread.current[:user] = user 

这其中贯穿每个用户会话访问。

回答

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 localUser = YourResource.getUser(); 

您可以从上下文通过清除用户对象ThreadLocal.remove()方法。