Axis2:禁用MustUnderstand标头检查

der*_*oni 3 java soap axis2 web-services header

我正在使用Axis2框架编写Web服务.该服务将充当DMZ中的代理.它实际上只是我们本地局域网中真实服务的中继.

该服务使用设置了mustUnderstand标志的标头.但由于代理服务相当简单,它无法理解这些头文件,它只是将请求中继到我们的局域网中,可以处理所有头文件.

问题是,Axis2检查标头并引发故障,因为通常读取和理解标头的模块不存在.

有没有办法配置Axis2,它确实忽略了mustUnderstand标志?

或者,从代码处理它的方法也是一种方法.

kar*_*rts 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

根据@karoberts 的回应,我所做的是:

  • 修改axis2.xml中的“Inflow”部分,添加以下内容

    <phase name="PreDispatch">
        <handler name="WSQinHandler"
                 class="com.qin.utils.post.WSQinHandler"/>
    </phase>
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用处理程序的名称创建一个新类。魔法来自具有 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;
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)