我正在使用Axis2框架编写Web服务。该服务将充当DMZ中的代理。它实际上只是我们当地局域网中真实服务的中继。
该服务使用设置了mustUnderstand标志的标头。但由于代理服务相当简单,它无法理解这些头文件,它只是将请求转发到我们的局域网中,可以处理所有头文件。
问题是,Axis2会检查标头并引发错误,因为通常读取并理解标头的模块不存在。
有没有办法配置Axis2,它确实忽略了mustUnderstand标志?
另外,从代码中处理这种方法也是一种方法。
答案 0 :(得分: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();
}
}
答案 1 :(得分:4)
根据@karoberts的回应我做了什么:
修改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;
}
}