2011-01-17 6 views
2

Я пишу веб-сервис с использованием рамки Axis2. Служба будет действовать как прокси-сервер в DMZ. Это действительно просто реле для реального сервиса, который находится на нашем локальном компьютере.Axis2: отключить проверку заголовка MustUnderstand

Служба использует заголовки, у которых установлен флаг mustUnderstand. Но поскольку прокси-сервис довольно прост, он не может понять эти заголовки, он просто должен передать запрос в наш lan, где все заголовки могут обрабатываться.

Проблема заключается в том, что Axis2 проверяет заголовки и вызывает ошибку, поскольку модуль, который нормально читает и понимает заголовок, отсутствует.

Есть ли способ настроить Axis2 так, чтобы он игнорировал флаг mustUnderstand?

В качестве альтернативы можно также использовать способ обработки этого кода.

ответ

5

Мы должны были сделать что-то подобное, чтобы это приблизило вас к тому, что вы хотите.

Что вам нужно, это org.apache.axis2.handlers.AbstractHandler

В функции Invoke(MessageContext msgContext), вы можете сделать что-то вроде этого

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

Что я сделал, основываясь на ответе @karoberts является:

  • Измените раздел «Приток» в файле axis2.xml и добавьте следующее:

    <phase name="PreDispatch"> 
        <handler name="WSQinHandler" 
          class="com.qin.utils.post.WSQinHandler"/> 
    </phase> 
    
  • Создайте новый класс с именем обработчика. волшебство поставляется с объектом SOAPBlock, у которого есть setMustUnderstand. Если для этого метода установлено значение 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; 
        } 
    
    } 
    
Смежные вопросы