Axis2: отключить MustUnderstand Проверка заголовка - PullRequest
2 голосов
/ 17 января 2011

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 17 января 2011

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

Что вам нужно, это 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 голосов
/ 12 апреля 2016

Что я сделал, основываясь на ответе @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;
        }
    
    }
    
...