如何获取SOAP标头

这是请求

  someId   ...   

我想得到那个userId

我试过这个

 private List
getHeaders() { MessageContext messageContext = context.getMessageContext(); if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { return null; } Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); return CastUtils.cast((List) message.get(Header.HEADER_LIST)); } private String getHeader(String name) { List
headers = getHeaders(); if (headers != null) { for (Header header : headers) { logger.debug(header.getObject()); // return header by the given name } } return null; }

并记录[userId : null] 。 我怎样才能得到这个值,为什么在那里是null

“[userId:null]”通常是DOM元素的“toString”打印输出。 最有可能的是你做的事情

 logger.debug(header.getObject().getClass()) 

你会看到它是somesort的DOM Element子类。 因此,像:

 logger.debug(((Element)header.getObject()).getTextContent()) 

可能会打印文本节点。

  import javax.xml.soap.*; SOAPPart part = request.getSOAPPart(); SOAPEnvelope env = part.getEnvelope(); SOAPHeader header = env.getHeader(); if (header == null) { // Throw an exception } NodeList userIdNode = header.getElementsByTagNameNS("*", "userId"); String userId = userIdNode.item(0).getChildNodes().item(0).getNodeValue(); 

您可以在没有拦截器且没有JAXB的情况下获取soap标头。

在service_impl类中添加:

 public class YourFunctionNameImpl implements YourFunctionName{ @Resource private WebServiceContext context; private List
getHeaders() { MessageContext messageContext = context.getMessageContext(); if (messageContext == null || !(messageContext instanceof WrappedMessageContext)) { return null; } Message message = ((WrappedMessageContext) messageContext).getWrappedMessage(); List
headers = CastUtils.cast((List) message.get(Header.HEADER_LIST)); return headers; }

然后在您的函数中,您可以使用:

 List
headers = getHeaders(); for(Iterator
i = headers.iterator(); i.hasNext();) { Header h = i.next(); Element n = (Element)h.getObject(); System.out.println("header name="+n.getLocalName()); System.out.println("header content="+n.getTextContent()); }

拥有MessageContext messageContext,您可以使用以下代码:

 HeaderList hl = (HeaderList) messageContext.get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); 

这使您可以访问所有SOAP标头。

我们可以通过在CXF拦截器中添加以下代码来获取服务器端的SOAP头。

创建一个类似的

公共类ServerCustomHeaderInterceptor扩展AbstractSoapInterceptor {

 @Resource private WebServiceContext context; public ServerCustomHeaderInterceptor() { super(Phase.INVOKE); } @Override public void handleMessage(SoapMessage message) throws Fault,JAXBException { System.out.println("ServerCustomHeaderInterceptor handleMessage"); JAXBContext jc=null; Unmarshaller unmarshaller=null; try { jc = JAXBContext.newInstance("org.example.hello_ws"); unmarshaller = jc.createUnmarshaller(); } catch (JAXBException e) { e.printStackTrace(); } List
list = message.getHeaders(); for (Header header : list) { ElementNSImpl el = (ElementNSImpl) header.getObject(); ParentNode pn= (ParentNode) el.getFirstChild(); //Node n1= (Node) pn; //Node n1= (Node) el.getFirstChild(); CustomHeader customHeader=(CustomHeader) unmarshaller.unmarshal(el.getFirstChild()); } }

在此之后我们需要将其作为拦截器注入

      

在您的服务器上下文xml中。

我们可能需要根据您的要求更改几行。 基本流程将像这样工作。