java RestFull 在操作线程中获取当前用户
java RestFull get current user in action thread
我需要在 restful 网络服务中获取 JPA EntityListener
中的当前用户。这是我的代码:
服务网站:
@POST
@Produces({"application/json"})
@Consumes({"application/json"})
public Response create(@HeaderParam("Authorization") String tokenAuth,
AreaTran areaT) {
Response res;
User user = null;
try {
user = testUser(tokenAuth);
Area area = areaCont.create(user, areaT);
res = AppConf.genOk("Area " + area.getNombre() + " creada correctamente");
} catch (Exception e) {
res = le.gen(e, user);
}
return res;
}
在这里我得到了登录用户user = testUser(tokenAuth);
我的问题在这里:
public class AuditEntityListener {
@PrePersist
public void prePersist(AuditableEntity e) {
e.setCreatedDate(new Date());
//how get the current user for this transaction HERE!!!!!
}
@PreUpdate
public void preUpdate(AuditableEntity e) {
e.setLastModifiedDate(new Date());
}
}
有什么方法可以获取请求流的用户?
这是解决方案:
1)在此class存储当前交易的数据
public class RequestContext {
private static ThreadLocal<Map<Object, Object>> attributes = new ThreadLocal<>();
public static void initialize() {
attributes.set(new HashMap());
}
public static void cleanup() {
attributes.set(null);
}
public static <T> T getAttribute(Object key) {
return (T) attributes.get().get(key);
}
public static void setAttribute(Object key, Object value) {
attributes.get().put(key, value);
}
}
2) 要初始化和清除的侦听器
@Provider
public class RequestContextFilter implements ContainerRequestFilter,ContainerResponseFilter {
@EJB
UserCont uCont;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
RequestContext.initialize();
//Here your code for assign data
//RequestContext.setAttribute("myAtribute", value);
//In my case
String tokenAuth = requestContext.getHeaderString("Authorization");
Long u = null;
try {
u = Sessions.get(tokenAuth);
} catch (Exception e) {
}
User user = null;
if (u != null) {
user = uCont.find(u);
RequestContext.setAttribute("user", user);
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
RequestContext.cleanup();
}
}
3) 在任何地方使用它
public class AuditEntityListener {
@PrePersist
public void prePersist(AuditableEntity e) {
e.setCreatedDate(new Date());
//In my case
e.setCreatedBy((User) RequestContext.getAttribute("user"));
}
@PreUpdate
public void preUpdate(AuditableEntity e) {
e.setLastModifiedDate(new Date());
}
}
我需要在 restful 网络服务中获取 JPA EntityListener
中的当前用户。这是我的代码:
服务网站:
@POST
@Produces({"application/json"})
@Consumes({"application/json"})
public Response create(@HeaderParam("Authorization") String tokenAuth,
AreaTran areaT) {
Response res;
User user = null;
try {
user = testUser(tokenAuth);
Area area = areaCont.create(user, areaT);
res = AppConf.genOk("Area " + area.getNombre() + " creada correctamente");
} catch (Exception e) {
res = le.gen(e, user);
}
return res;
}
在这里我得到了登录用户user = testUser(tokenAuth);
我的问题在这里:
public class AuditEntityListener {
@PrePersist
public void prePersist(AuditableEntity e) {
e.setCreatedDate(new Date());
//how get the current user for this transaction HERE!!!!!
}
@PreUpdate
public void preUpdate(AuditableEntity e) {
e.setLastModifiedDate(new Date());
}
}
有什么方法可以获取请求流的用户?
这是解决方案:
1)在此class存储当前交易的数据
public class RequestContext {
private static ThreadLocal<Map<Object, Object>> attributes = new ThreadLocal<>();
public static void initialize() {
attributes.set(new HashMap());
}
public static void cleanup() {
attributes.set(null);
}
public static <T> T getAttribute(Object key) {
return (T) attributes.get().get(key);
}
public static void setAttribute(Object key, Object value) {
attributes.get().put(key, value);
}
}
2) 要初始化和清除的侦听器
@Provider
public class RequestContextFilter implements ContainerRequestFilter,ContainerResponseFilter {
@EJB
UserCont uCont;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
RequestContext.initialize();
//Here your code for assign data
//RequestContext.setAttribute("myAtribute", value);
//In my case
String tokenAuth = requestContext.getHeaderString("Authorization");
Long u = null;
try {
u = Sessions.get(tokenAuth);
} catch (Exception e) {
}
User user = null;
if (u != null) {
user = uCont.find(u);
RequestContext.setAttribute("user", user);
}
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
RequestContext.cleanup();
}
}
3) 在任何地方使用它
public class AuditEntityListener {
@PrePersist
public void prePersist(AuditableEntity e) {
e.setCreatedDate(new Date());
//In my case
e.setCreatedBy((User) RequestContext.getAttribute("user"));
}
@PreUpdate
public void preUpdate(AuditableEntity e) {
e.setLastModifiedDate(new Date());
}
}