閱讀新的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
嗨Federico,感謝您的回答,是的,這是真的,上下文正確傳播到可運行...但我問爲什麼servlet上下文從異步獲得的主體和EJB上下文沒有。 ..我也期待這種方法的背景之間的主要傳播。不幸的是我不能使用異步EJB,因爲我使用線程來改進UI性能,而不是數據加載 – Antlia 2014-11-26 14:36:55
@Antlia我已經用更多信息更新了答案。我認爲當從AsyncContext.start(Runnable)執行時,jboss不會在可運行時實現傳播。 – 2014-11-26 16:45:22
非常感謝您發佈的文檔,我在網絡上搜索並找到任何內容。 對於您在JBoss論壇上發佈的鏈接,它已從我的帳戶發佈:D – Antlia 2014-11-27 09:42:12