2016-12-14 46 views
0

我做这样的事情自定义拦截器添加标题不更新标题发送消息

org.apache.cxf.endpoint.Client client = ClientProxy.getClient(port); 
      client.getInInterceptors().add(new HeaderHandler()); 

      try { 
       port.[my method](inputs); 
} 

而且我的处理程序看起来像

public class HeaderHandler extends LoggingInInterceptor { 

    public HeaderHandler() { 
     super(Phase.PRE_STREAM); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public void handleMessage(Message message) throws org.apache.cxf.interceptor.Fault { 
     Map<String, List<String>> headers = CastUtils.cast((Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS)); 
     List<String> clientid = new ArrayList<String>(); 
     clientid.add(""); 
     headers.put("clientid", clientid); 

     List<String> authorization = new ArrayList<String>(); 
     authorization.add("Basic @#$%#$%^#$^"); 
     headers.put("Authorization", authorization); 

     message.put(Message.PROTOCOL_HEADERS, headers); 
     System.out.println("called"); 
    } 
} 

手柄消息的方法总是被调用,并通过我调试可以找到在方法结束之前保存的消息中创建的头文件,但是当端口方法解析时,我只需在soap请求中再次发送默认头文件

Headers: {Accept=[*/*], cache-control=[no-cache], connection=[keep-alive], Content-Length=[494], content-type=[application/soap+xml; action="urn:[my method]"; charset=UTF-8], host=[localhost:8080], pragma=[no-cache], user-agent=[Apache-CXF/3.1.8]} 

什么给了?

回答

1

请检查CXF FAQ:How can I add soap headers to the request/response?,我建议使用CXF方式

Client client = ClientProxy.getClient(port); 

// Add HTTP headers to the web service request 
Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("Authorization", Arrays.asList(authorization)); 
headers.put("clientid", Arrays.asList(clientid)); 
proxy.getRequestContext().put(Message.PROTOCOL_HEADERS, headers); 

// Add SOAP headers 
List<Header> soapheaders = new ArrayList<Header>(); 
Header dummyHeader = new Header(new QName("uri:org.apache.cxf", "dummy"), "decapitated", new JAXBDataBinding(String.class)); 
soapheaders.add(dummyHeader); 
client.getRequestContext().put(Header.HEADER_LIST, soapheaders); 
+0

它的工作!非常感谢! –

+0

P.S.显然,唯一让我错过的解决方案是HeaderHandler需要成为outInterceptor而不是inInterceptor。我不知道为什么,但你的解决方案好多了! –

+0

奥普斯,我没有看到它。在客户端,一个OUT拦截器从'client - > server'执行,IN拦截器从'server - > client'执行,所以你正在修改收到的头文件! – pedrofb