最近做第三方接口,服务端需要

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://***.com/webservices" xmlns:cus="http://***/CustomUI">
   <soapenv:Header>
      <web:SessionType>***</web:SessionType>
      <web:PasswordText>***</web:PasswordText>
      <web:UsernameToken>***</web:UsernameToken>
   </soapenv:Header>
   <soapenv:Body>
      <cus:HQHPExpenseVoucherFlowServiceApprove_Input>
          ......................
      </cus:HQHPExpenseVoucherFlowServiceApprove_Input>
   </soapenv:Body>
</soapenv:Envelope>

服务端添加了 header验证,项目用的是cxf,按照之前的思路,就是在客户端调用时直接添加拦截器,

在拦截器中添加hear 验证需要的内容,

拦截器中传递的内容是

<soapenv:Header>
          <SessionType>***</web:SessionType>
          <PasswordText>***</web:PasswordText>
          <UsernameToken>***</web:UsernameToken>
   </soapenv:Header>

调用客户端时就直接验证失败,错误错误就是soapenv:Envelope中添加需要添加一个xmlns:web="http://***.com/webservices" 的命名空间

问题找到了,然后就就是漫长的查质料,怎么样在soapenv:Envelope中添加命名空间,网上居然搜不到解决方案.

最后发现可能思路有点局限了,一直都停留在cxf 的结局方案,经过漫长的测试下终于得到结局,贴下解决方案希望可以帮到更多的程序员朋友

1,配置jaxws:handlers

(1)在webservice配置文件中添加jaxws:handlers(这个具体是什么东西百度一下这里不解释)

<jaxws:client id="client"  serviceClass="com.webService.client.crm.reimburse.xxxxxxSpcService"
     address="xxxxxx">
               
               <!-- 用户名密码验证 -->
               <jaxws:handlers>
                    <bean class="com.webService.client.handler.xxxxHandler"></bean>
               </jaxws:handlers>
           
     </jaxws:client>

(2)xxxxHandler中的代码

package com.webService.client.handler;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class SiebelHeaderHandler implements SOAPHandler<SOAPMessageContext> {
   
         public  SiebelHeaderHandler(){
             System.out.println("crm,handler 用户验证加载成功........................");
         }

public boolean handleMessage(SOAPMessageContext context) {
            Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
            QName usernameQName = new QName("http://xxx.com/webservices", "UsernameToken","siebelwsh");
            QName passwordQName = new QName("http://xxx.com/webservices", "PasswordText","siebelwsh");
            QName sessionTypeQName = new QName("http://xxx.com/webservices", "SessionType","siebelwsh");

if (isRequest) {
                try {
                    SOAPMessage soapMsg = context.getMessage();
                    SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
                    SOAPHeader soapHeader = soapEnv.getHeader();
                    soapEnv.addNamespaceDeclaration("web", "http://xxxxx.com/webservices");
                    //if no header, add one
                    if (soapHeader == null) {
                        soapHeader = soapEnv.addHeader();
                    }
                 
                       String username = "xxx";
                       String password = "xxxx";
           
                       //添加SiebelUsernameToken
                       SOAPHeaderElement usernameHeaderElement = soapHeader.addHeaderElement(usernameQName);
                       usernameHeaderElement.addTextNode(username);
                       //添加SiebelPasswordText
                       SOAPHeaderElement passwordHeaderElement = soapHeader.addHeaderElement(passwordQName);
                       passwordHeaderElement.addTextNode(password);
                       //添加SiebelSessionType
                       SOAPHeaderElement SessionTypeHeaderElement = soapHeader.addHeaderElement(sessionTypeQName);
                       SessionTypeHeaderElement.addTextNode("None");
                        soapMsg.saveChanges();
                } catch (SOAPException e) {
                    //logger.warn(e.getMessage());
                } catch (Exception e) {
                    //logger.error(e.getMessage(),e);
                }

}
           
            return true;
        }

public Set<QName> getHeaders() {
            return null;
        }

@Override
        public boolean handleFault(SOAPMessageContext context) {
            // TODO Auto-generated method stub
            return false;
        }

@Override
        public void close(MessageContext context) {
            // TODO Auto-generated method stub
            
        }
    }

添加Handler后顺利通过;

注意:其实这里<web:SessionType>***</web:SessionType> 的web可以相当于是一个变量 xmlns:web="http://***.com/webservices"

webservice调用服务端数据时给soapenv:Envelope 添加自定义的命名空间的更多相关文章

  1. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...

  2. Webservice客户端动态调用服务端功能方法

    一.发布WebService服务 方式一:在服务端生成wsdl文件,下方客户端直接引用即可     优点:针对要发布的方法生成一个wsdl文件即可,无需多余配置.   缺点:每次服务端方法发生改变都需 ...

  3. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

  4. .Net Mvc3框架调用服务端控件解决方案

      /*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ...

  5. 网站的优化----首页优化---app调取服务端数据

    高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...

  6. 使用DWR实现JS调用服务端Java代码

    DWR简介 DWR全称Direct Web Remoting,是一款非常优秀的远程过程调用(Remote Procedure Call)框架,通过浏览器提供的Ajax引擎实现在前端页面的JS代码中调用 ...

  7. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  8. WebService调用一对多关联关系时出现 死循环:A cycle is detected in...

    通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...

  9. 服务端渲染时无法获得环境变量的值,一直是undefined

    1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie

随机推荐

  1. CentOS评估磁盘I/O性能读写极限测试

    用一个fio工具 安装 yum -y install fio 二,FIO用法: 随机读:fio  -direct=1 -iodepth 1 -thread -rw=randread -ioengine ...

  2. 关于VSS上的项目源码管理的注意问题

    1.将项目添加到vss上面去 如果项目取的名字没有问题,则不需要去vss上面去新建项目,直接在解决方案那里右击“添加到vss”中,把第一个输入框中的名字(xxxx.root)全部清除掉.确定即可. 2 ...

  3. python算法——第四天

    一.递归 def func(num): if num / 2 > 0: num -= 1 print(num) num = func(num) print('quit') return num ...

  4. DataGridView 的单元格的边框、 网格线样式的设定【转】

    1) DataGridView 的边框线样式的设定DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的. BorderStyle 属性设定值是 ...

  5. .net的五层架构

    原文章地址是http://www.360doc.com/content/11/1210/21/19147_171335782.shtml 我们刚开始学习架构的时候,首先会想到分层的概念,分层架构比较经 ...

  6. GraphicsMagick+im4java 图片处理

    最近团队内部分享GraphicsMagick+im4java 图片处理 就把如何安装,运行都统一整理一下. 详细如下: 在windows上安装ImageMagick: download 地址:http ...

  7. tab1

    <html> <head> <meta charset="UTF-8"> <title>tab</title> < ...

  8. php for循环嵌套

    <?php     //2.打印一个50*50的 'o' 的正方形方整, 使用for的嵌套     // oooooo     // oooooo     // oooooo //for循环嵌套 ...

  9. VB鼠标指针

    vbDefault 0 (缺省值)形状由对象决定. VbArrow 1 箭头. VbCrosshair 2 十字线(crosshair 指针). VbIbeam 3 I 型 VbIconPointer ...

  10. ServletConfig对象和它在开发中的应用场

    package cn.itcast; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumerat ...