首先吐槽一句,网上的各位“大神”,你们的代码或者转载前都测试过吗?或者哪怕你说一下你的环境(版本)也好啊!
服务端获取Header数据
先说一说我的是什么Header数据(以下图片来自于soapUI工具,CXF包为3.2.5):
1、添加自定义Header数据
2、通过RAW模式查看我们的Header。非上图中XML代码中的<soap:Header>
OK,这就是我们自定义的Header。下面看看是怎么获取的。
public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
public ReadSoapHeader() {
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}
public void handleMessage(SoapMessage message) throws Fault {
TreeMap<String, ArrayList<Object>> tree = (TreeMap<String, ArrayList<Object>>) message.get(Message.PROTOCOL_HEADERS);
System.out.println("==============="+(tree.get("username").get(0)));
}
}
是不是感觉很简单,对,没错,其实就是这么简单。至于我是怎么发现使用这种方式的?当然是万能的debug了,通过debug模式查看message里面到底有什么东西?
通过上面的debug我们可以看到message是Map模式,通过get(key),可以获得相应的值。再次发现key为Message.PROTOCOL_HEADERS,返回的是TreeMap型,而TreeMap的key就是我们定义的Header中的key,只是value是ArrayList类型。
虽然只是简单的问题,但是尽信书,不如无书啊。不要怀疑自己,有可能是方法不对!!!
客户端传递数据
同服务端一样的道理,在服务端在Map里面取,我们就在客户端往Map里面塞数据:
public class SoapHeaderInterceptor extends AbstractSoapInterceptor
{
public SoapHeaderInterceptor()
{
super(Phase.WRITE);
}
public void handleMessage(SoapMessage message) throws Fault
{
TreeMap<String, ArrayList<String>> map = (TreeMap<String, ArrayList<String>>)message.get(Message.PROTOCOL_HEADERS);
ArrayList<String> al = new ArrayList<String>();
al.add("111");
ArrayList<String> a2 = new ArrayList<String>();
a2.add("222");
map.put("username", al);
map.put("password" , a2);
}
}
public static void main(String[] args) {
URL wsdlURL = UserServiceService.WSDL_LOCATION;
UserServiceService ss = new UserServiceService(wsdlURL, SERVICE_NAME);
IUserService port = ss.getUserServicePort();
System.out.println("Invoking queryStations...");
Client client = ClientProxy.getClient(port);
client.getOutInterceptors().add(new SoapHeaderInterceptor());
String user = port.getUser();
System.out.println("user = " + user);
}