亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將值傳遞給注入的 EJB

將值傳遞給注入的 EJB

青春有我 2022-09-07 17:09:04
我有一個 EJB 應用程序,它由兩個 Bean(Web 層)和(業務層)組成,其中注入了 .ServiceEJBBusinessEJBBusinessEJBServiceEJBServiceEJB從瀏覽器接收 HTTP 請求,調用 中的方法,獲取結果,然后發送 HTTP 響應。BusinessEJB此外,還有權訪問存儲登錄用戶的對象。無權訪問對象。ServiceEJBHttpSessionuserIdBusinessEJBHttpSession應用程序需要記錄消息(例如,使用 sl4j/logback)。它可以在 or 中記錄消息,并且當它記錄消息時,它必須在日志條目中包含會話。ServiceEJBBusinessEJBuserId由于 沒有 ,它需要從 中獲取它。問題是實現這一目標的最佳方式是什么。我不想做的是將字段作為參數添加到 中的每個方法中,因為應用程序中有許多s和s(以及由其調用的其他bean也生成日志條目),并且我不想用該字段污染應用程序。相反,我可以在EJB級別有一個字段,但是如何填充它們?有沒有辦法通過注釋來實現這一點?歡迎任何建議。BusinessEJBuserIdServiceEJBuserIdBusinessEJBServiceEJBBusinessEJBBusinessEJBuserIduserId@Produces({MediaType.APPLICATION_JSON})@Consumes({MediaType.APPLICATION_JSON})@Statelesspublic class ServiceEJB {    @Context    HttpServletRequest httpRequest;    @Inject    private BusinessEJB bean;    private String userId;    @Path("someurl")    public Response someMethod1() {       final HttpSession session = httpRequest.getSession();       // get the userId from the session       String s = bean.someMethod2();       // return Response    }}@Statelesspublic class BusinessEJB {  private String userId;  public String someMethod2() {     // ....  log an entry with userId     return "something";  }   }
查看完整描述

2 回答

?
DIEA

TA貢獻1820條經驗 獲得超3個贊

一些提示/評論:

  1. 如果與應用程序服務器安全性集成,那么用戶名在任何組件上都可用。EJB 可以通過調用 的注入變體來獲得它,這里是:getCallerPrincipal()EJBContextjavax.ejb.SessionContext

    @Resource
    private SessionContext sessionCtx;

    Servlet 可以從 中檢索主體。JAX-RS 組件 () 可以從 中檢索它。HttpServletRequest.getUserPrincipal()ServiceEJBjavax.ws.rs.core.SecurityContext.getUserPrincipal()

    您有什么理由不與應用程序服務器安全性集成嗎?

  2. 如果您有充分的理由不與應用程序服務器安全性集成,我會提出解決方案與先前答案的變體。其變體是將應用于所有資源(servlet 過濾器或 JAX-RS)的過濾器中的用戶數據設置為用戶數據,這樣您就不必擔心在多個位置進行設置。ContainerRequestFilter

  3. 如果您只需要用戶 ID 進行日志記錄,我建議您看一下 slf4j 中映射診斷上下文 (MDC) 的概念。有了它,您可以在請求開始時盡早設置用戶 ID,然后使其可用于所有日志記錄語句。


查看完整回答
反對 回復 2022-09-07
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

創建一個請求范圍的 CDI Bean,即 .UserContext

將其注入到兩個 EJB 中。

在設置用戶的ID和讀取它。ServiceEJBBusinessEJB


查看完整回答
反對 回復 2022-09-07
  • 2 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號