2014-11-25 78 views
0

閱讀新的Servlet 3.0規範,我發現HttpServletRequest的startAsynch方法,它聲稱以異步方式將正確的上下文信息傳播到傳遞的runnable。Servlet 3.0 AsyncContext和EJB @RolesAllowed在JBoss

,我寫我的servlet的doGet方法裏面的代碼:

@EJB 
private EJBManagerLocal manager; 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { 
    if(request.getUserPrincipal() != null && request.isUserInRole("admin")) 
      //Method protected by @RolesAllowes("admin") annotation EJB-side 
      manager.verify(); 

    final AsyncContext ctx = request.startAsync(request,response); 
    ctx.start(new Runnable(){ 
      HttpServletRequest = (HttpServletRequest)ctx.getRequest(); 
      if(request.getUserPrincipal() != null && request.isUserInRole("admin")) 
       //Method protected by @RolesAllowes("admin") annotation EJB-side 
       manager.verify(); 
    }); 
} 

當調用manager.verify()的第一次,AsyncContext外一切正常,但在調試了Runnable進入裏面時,我可以看到,即使'if'被成功傳遞(所以主體已經被正確地傳播到AsyncContext中的Runnable中),當調用由@RolesAllowed註解保護的EJB方法時,JBoss拋出一個異常說「方法驗證的調用「 不允許。

任何人都可以幫助我嗎?

平臺:JBoss的EAP 6.2.0

編輯:到JBoss EAP相同的行爲6.3.0

回答

0

號稱使異步方式傳播的東西的權利 上下文信息傳遞的可運行。

傳播到runnable會得到滿足,您可以訪問委託人及其角色。

if(request.getUserPrincipal() != null && request.isUserInRole("admin")) 

我認爲ejb異步調用的最佳方法是使用@Asynchronous註釋。

參見:Asynchronous Method Invocation

編輯:

根據Java™ Servlet Specification Version 3.0

Java企業版功能,如第15.2.2節,「網絡 應用環境」 15-174頁和部分15.3.1, 第15-176頁中的「在EJB™調用中傳播安全身份」僅適用於執行初始請求的線程,或者通過AsyncContext.dispatch 方法將請求發送到容器。 Java Enterprise Edition功能可能可通過 AsyncContext.start(Runnable)方法直接在響應對象上運行的其他 線程可用。

看到這個話題在jboss論壇,是類似的問題:Anonymous principal when invoking EJB from a thread inside a servlet

+0

嗨Federico,感謝您的回答,是的,這是真的,上下文正確傳播到可運行...但我問爲什麼servlet上下文從異步獲得的主體和EJB上下文沒有。 ..我也期待這種方法的背景之間的主要傳播。不幸的是我不能使用異步EJB,因爲我使用線程來改進UI性能,而不是數據加載 – Antlia 2014-11-26 14:36:55

+0

@Antlia我已經用更多信息更新了答案。我認爲當從AsyncContext.start(Runnable)執行時,jboss不會在可運行時實現傳播。 – 2014-11-26 16:45:22

+0

非常感謝您發佈的文檔,我在網絡上搜索並找到任何內容。 對於您在JBoss論壇上發佈的鏈接,它已從我的帳戶發佈:D – Antlia 2014-11-27 09:42:12