2011-01-17 8 views
2

Ich schreibe einen Web-Service mit dem Axis2 Framework. Der Dienst wird als Proxy in einer DMZ fungieren. Es ist wirklich nur eine Verbindung zum echten Service, der in unserem lokalen LAN ist.Axis2: Disable MustUnderstand Header Überprüfung

Der Dienst verwendet Header, bei denen das Kennzeichen mustUnderstand gesetzt ist. Aber da der Proxy-Service ziemlich einfach ist, kann er diese Header nicht verstehen, er sollte die Anfrage nur in unser LAN weiterleiten, wo alle Header verarbeitet werden können.

Das Problem ist, dass Axis2 die Header überprüft und wirft einen Fehler, da das Modul, das normalerweise liest und versteht der Header nicht vorhanden ist.

Gibt es eine Möglichkeit Axis2 zu konfigurieren, so, dass es die Flagge nicht ignorieren mustunderstand?

Alternativ wäre auch eine Möglichkeit, dies aus dem Code zu behandeln.

Antwort

5

Wir mussten etwas Ähnliches machen, also sollte das Ihnen nahe bringen, was Sie wollen.

Was Sie brauchen, ist ein org.apache.axis2.handlers.AbstractHandler

In der Invoke(MessageContext msgContext) Funktion können Sie so etwas wie dieses

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

tun, was ich tat, auf der Grundlage der Antwort von @karoberts ist:

  • ändern Sie den "Inflow" in axis2.xml und fügen Sie die folgende

  • Erstellen Sie eine neue Klasse mit dem Namen der Prozedur. Die Magie kommt mit dem SOAPBlock-Objekt, das den setMustUnderstand hat. Wenn diese Methode auf "false" gesetzt ist, prüft Axis den Header nicht.

    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; 
        } 
    
    }