2016-06-21 41 views
0

我想過濾(javax.servlet.Filter)所有傳入的SOAP請求在我所有的Web服務端點上。這些Web服務從@Stateless EJB的創建和使用Message Authentication over SSL過濾@Stateless @Webservice

我的Web服務註釋像

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

我有一個存在於我的GlassFish的lib/目錄和裏面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端點之外的所有東西(從未擊中我的WebServiceA -> getMethodA()端點

我也嘗試推行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

過濾器與servlet技術一起使用。在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

,我決定通過刪除Secure Service和禁用Message Authentication over SSL,在我glassfish-ejb-jar.xml設置<transport-guarantee>NONE這應該是沒關係禁用ws_security因爲與Web服務器的通信仍然是https。現在我可以創建一個EJBInterceptorSOAPHandler來適當編輯SOAP頭,然後調用我的自定義領域的登錄機制。感謝@ user2286167的方向。