2014-11-25 2 views
0

, читая новые спецификации сервлета 3.0, я нашел метод startAsynch для HttpServletRequest, который утверждает, что делает вещи асинхронными способами распространения правильной контекстной информации на пройденную runnable.Servlet 3.0 AsyncContext и EJB @RolesAllowed в JBoss

Я написал этот код в методе 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» успешно передается (так что принцип был правильно распространен на Runnable в AsyncContext), при вызове метода EJB, защищенного аннотацией @RolesAllowed, JBoss генерирует исключение, говорящее, что «вызов метода проверяет " не допускается.

Может ли кто-нибудь мне помочь?

Платформа: JBoss EAP 6.2.0

EDIT: То же самое поведение в JBoss EAP 6.3.0

ответ

0

, который утверждает, что делает вещи асинхронным способом, распространяющиеся правильную контекстную информацию пропущенный работоспособной.

Выполнено распространение на runnable, вы можете получить доступ к главному и их ролям.

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

Я думаю, что лучший подход для асинхронных вызовов EJB является использование @Asynchronous аннотацию.

Смотрите также: Asynchronous Method Invocation

EDIT:

По Java™ Servlet Specification Version 3.0:

Java Enterprise Edition функции, такие как раздел 15.2.2, «Web Application Environment» на странице 15-174 и Раздел 15.3.1, «Распространение идентификатора безопасности в вызовах EJB ™» на стр. 15-176: доступен только для потоков, выполняющих начальный запрос, или когда запрос отправляется в контейнер по методу AsyncContext.dispatch . Возможности Java Enterprise Edition могут быть доступны другим потокам, действующим непосредственно на объект ответа через метод AsyncContext.start(Runnable).

Посмотрите эту тему на форуме jboss, это аналогичная проблема: Anonymous principal when invoking EJB from a thread inside a servlet.

+0

Привет, Федерико, спасибо за ваш ответ, да, это правда, что контекст правильно распространяется на runnable ... но я спрашиваю, почему контекст сервлета получил от Async, у которого есть главный, а контекст EJB этого не делает. .. Я ожидал также принципиального распространения между контекстами с этим подходом. К сожалению, я не могу использовать Asynchronous EJB, потому что я использую потоки для улучшения производительности пользовательского интерфейса, а не для загрузки данных. – Antlia

+0

@Antlia Я обновил ответ с дополнительной информацией. Я думаю, что jboss не реализует распространение в runnable, когда это выполняется из AsyncContext.start (Runnable). –

+0

Большое спасибо за те документы, которые вы опубликовали, я искал по всему Интернету и нашел что-нибудь. За ссылку, которую вы опубликовали на форуме JBoss, она была опубликована в моей учетной записи: D – Antlia