【发布时间】:2023-04-07 05:44:01
【问题描述】:
阅读新的 Servlet 3.0 规范,我发现了 HttpServletRequest 的 startAsynch 方法,它声称以异步方式将正确的上下文信息传播到传递的可运行对象。
我在我的 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 中的相同行为
【问题讨论】:
标签: java security servlets asynchronous jboss