2011-01-17 3 views
2

Axis2フレームワークを使用してWebサービスを作成しています。このサービスは、DMZのプロキシとして機能する予定です。それは実際に私たちのローカルLANにある実際のサービスへの中継です。Axis2:MustUnderstandヘッダーチェックを無効にする

サービスでは、mustUnderstandフラグが設定されたヘッダーが使用されます。しかし、プロキシサービスはかなりシンプルなので、これらのヘッダーを理解することはできません。すべてのヘッダーを処理できるlanにリクエストを中継することになっています。

問題はAxis2がヘッダーをチェックし、通常はヘッダーを読み取って理解しているモジュールが存在しないためです。

mustUnderstandフラグを無視してAxis2を設定する方法はありますか?

また、コードからそれを処理する方法も評価されます。

答えて

5

私たちは同様のことをしなければならなかったので、これはあなたが望むものに近くなるはずです。

何が必要あなたは@karobertsの応答に基づいて、私が何をしたか、この

SOAPHeader header = msgContext.getEnvelope().getHeader(); 
if(header != null) 
{ 
    Iterator<?> blocks = soapHeader.examineAllHeaderBlocks(); 
    while(blocks.hasNext()) 
    { 
     SOAPHeaderBlock block = (SOAPHeaderBlock)blocks.next(); 
     if(... some check to see if this is one of your headers ...) 
      block.setProcessed(); 
    } 
} 
4

ような何かを行うことができ、Invoke(MessageContext msgContext)機能でorg.apache.axis2.handlers.AbstractHandler

されている。

  • axis2.xmlの "Inflow"セクションを変更し、次を追加します。

    <phase name="PreDispatch"> 
        <handler name="WSQinHandler" 
          class="com.qin.utils.post.WSQinHandler"/> 
    </phase> 
    
  • ハンドラの名前で新しいクラスを作成します。魔法にはsetMustUnderstandを持つSOAPBlockオブジェクトが付属しています。このメソッドをfalseに設定すると、Axisはヘッダーをチェックしません。

    package com.qin.utils.post; 
    
    import java.util.Iterator; 
    import org.apache.axiom.soap.SOAPEnvelope; 
    import org.apache.axiom.soap.SOAPHeader; 
    import org.apache.axiom.soap.SOAPHeaderBlock; 
    import org.apache.axis2.AxisFault; 
    import org.apache.axis2.context.MessageContext; 
    import org.apache.axis2.handlers.AbstractHandler; 
    
    public class WSQinHandler extends AbstractHandler { 
    
        @Override 
        public InvocationResponse invoke(MessageContext ctx) throws AxisFault { 
    
         SOAPEnvelope envelop = (SOAPEnvelope) ctx.getEnvelope(); 
         SOAPHeader header = envelop.getHeader(); 
         if(header != null) 
         { 
          Iterator<?> blocks = header.examineAllHeaderBlocks(); 
          while(blocks.hasNext()) 
          { 
           SOAPHeaderBlock block = (SOAPHeaderBlock)blocks.next(); 
           block.setMustUnderstand(false); 
          } 
         } 
         return InvocationResponse.CONTINUE; 
        } 
    
    } 
    
関連する問題