CXF获取及传递Header数据
https://blog.csdn.net/lx0088/article/details/81321771
首先吐槽一句,网上的各位“大神”,你们的代码或者转载前都测试过吗?或者哪怕你说一下你的环境(版本)也好啊!
服务端获取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);
-
-
}