簡體   English   中英

java RestFull獲取當前用戶在操作線程中

[英]java RestFull get current user in action thread

我需要在一個寧靜的Web服務中的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)在此類中存儲當前交易的數據

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());
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM