2016-06-21 3 views
0

Я пытаюсь отфильтровать (javax.servlet.Filter) все входящие запросы SOAP во всех концах моих веб-сервисов. Эти веб-сервисы создаются из @Stateless EJB и используя Message Authentication over SSLФильтр для @Stateless @Webservice

Мои веб-сервисы прокомментированы как

@WebService 
@Stateless 
public class WebServiceA { 
    @EJB 
    private MyEJB ejbRef; 
    ... 
    public Result getMethodA()... 
} 

У меня есть пользовательский фильтр, который существует в моем lib/ директории GlassFish и внутри config/default-web.xml у меня есть фильтр сопоставлен <url-patter>/*</url-pattern>

public final class MyFilter implements Filter { 

    @Override 
    public void init()... 

    @Override 
    public void destroy()... 

    @Override 
    public void doFilter(...) { 
     ... 
     System.out.println("Got to Filter"); 
     ... 
    } 
} 

фильтр вызывается на каждом запросе я делаю к применению для моих конечных точек SOAP, за исключением. Фильтр попадает в admin console, фильтр попадает в файлы -war, фильтр попадает при переходе на undeployed EAR ... в основном все, кроме развернутой конечной точки SOAP (никогда не попадает в конечную точку .

Я также попытался реализации SOAPHandler но, к сожалению это обрабатывается после методы аутентификации элементы контейнера вызываются (JAAS), и я должен изменить заголовок SOAP до контекста авторизации.

Я смотрел на эту ссылку Is it possible to define a servlet filter for a stateless ejb webservice, on GlassFish 3.1 но @RequestScoped не работает @Stateless, который требуется на @WebService, который отличается от ejb-jar

* Редактировать Я попробовал EJBInterceptors и так же, как SOAPHandler, перехватчик вызывается после безопасности, управляемой контейнером.

Спасибо за любую помощь

ответ

1

Фильтры используются вместе с сервлетов технологии. Использование их с EJB/JAX WS не будет перехватывать запросы.

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

Вот один образец.

public class MyEJBInterceptor { 

    @AroundInvoke 
    public Object invoke(InvocationContext context) throws Exception { 

    //Your code goes here 
    } 

Чтобы использовать этот перехватчик:

@Stateless 
@Interceptors({MyEJBInterceptor.class}) 
public class MyBean implements MyBeanLocal { 

    enter code here 

} 
+0

Спасибо, это звучит многообещающе. Я попытаюсь привести пример, и если это произойдет, я соглашусь. –

+0

Перехватчик вызывался, но только после того, как был вызван JAAS, мне это нужно раньше. Возможно, есть способ определить приоритет/порядок? –

+0

Он вызывается в том порядке, в котором вы перечисляете их в @ перехватчиках –

0

Помимо редактирования источника скумбриевидного гидролика, я решил отключить ws_security путем удаления Secure Service и отключения Message Authentication over SSL и установки <transport-guarantee> к NONE в моем glassfish-ejb-jar.xml Это должно быть в порядке поскольку связь с веб-сервером по-прежнему https. Теперь я могу создать EJBInterceptor или SOAPHandler, чтобы соответствующим образом отредактировать заголовок SOAP, а затем вызвать механизм входа в систему моего собственного царства. Спасибо @ user2286167 за направление.

 Смежные вопросы

  • Нет связанных вопросов^_^