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。下面看看是怎么获取的。

  1.  
    public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
  2.  
     
  3.  
    public ReadSoapHeader() {
  4.  
    super(Phase.PRE_PROTOCOL);
  5.  
    getAfter().add(SAAJInInterceptor.class.getName());
  6.  
    }
  7.  
     
  8.  
    public void handleMessage(SoapMessage message) throws Fault {
  9.  
    TreeMap<String, ArrayList<Object>> tree = (TreeMap<String, ArrayList<Object>>) message.get(Message.PROTOCOL_HEADERS);
  10.  
    System.out.println("==============="+(tree.get("username").get(0)));
  11.  
    }
  12.  
    }

是不是感觉很简单,对,没错,其实就是这么简单。至于我是怎么发现使用这种方式的?当然是万能的debug了,通过debug模式查看message里面到底有什么东西?

通过上面的debug我们可以看到message是Map模式,通过get(key),可以获得相应的值。再次发现key为Message.PROTOCOL_HEADERS,返回的是TreeMap型,而TreeMap的key就是我们定义的Header中的key,只是value是ArrayList类型。

虽然只是简单的问题,但是尽信书,不如无书啊。不要怀疑自己,有可能是方法不对!!!

客户端传递数据

同服务端一样的道理,在服务端在Map里面取,我们就在客户端往Map里面塞数据:

  1.  
    public class SoapHeaderInterceptor extends AbstractSoapInterceptor
  2.  
    {
  3.  
    public SoapHeaderInterceptor()
  4.  
    {
  5.  
    super(Phase.WRITE);
  6.  
    }
  7.  
     
  8.  
    public void handleMessage(SoapMessage message) throws Fault
  9.  
    {
  10.  
    TreeMap<String, ArrayList<String>> map = (TreeMap<String, ArrayList<String>>)message.get(Message.PROTOCOL_HEADERS);
  11.  
    ArrayList<String> al = new ArrayList<String>();
  12.  
    al.add("111");
  13.  
    ArrayList<String> a2 = new ArrayList<String>();
  14.  
    a2.add("222");
  15.  
    map.put("username", al);
  16.  
    map.put("password" , a2);
  17.  
     
  18.  
    }
  19.  
    }
  1.  
    public static void main(String[] args) {
  2.  
    URL wsdlURL = UserServiceService.WSDL_LOCATION;
  3.  
     
  4.  
    UserServiceService ss = new UserServiceService(wsdlURL, SERVICE_NAME);
  5.  
    IUserService port = ss.getUserServicePort();
  6.  
    System.out.println("Invoking queryStations...");
  7.  
     
  8.  
    Client client = ClientProxy.getClient(port);
  9.  
    client.getOutInterceptors().add(new SoapHeaderInterceptor());
  10.  
     
  11.  
    String user = port.getUser();
  12.  
    System.out.println("user = " + user);
  13.  
     
  14.  
    }
原文地址:https://www.cnblogs.com/linus-tan/p/13680137.html