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

<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. Advanced SQL

    Top number of records SELECT column_name FROM table_name LIMIT 5; Like/Not Like SELECT * FROM Custom ...

  2. 内网网段划分ciso交换机配置

    内网3750交换机配置: vlan 192 192.168.101.0/24 端口: 1--8vlan 10 10.10.10.0/24 端口: 9--16vlan 172 172.16.172.2/ ...

  3. 用JAVA写一个日历计划

    效果图(自己需要在前台加css修饰)

  4. vector容器的用法

    转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.p ...

  5. SQL serve 聚合函数、字符串函数

    1.聚合函数 sum,avg,max,min,count        having后面只能跟聚合函数 2.数学函数和字符串函数 3.练习: 1)新建一个学生信息表,根据问题写出程序. 2)新建一个超 ...

  6. [转载] Can't create table './store/#sql-b2c_1a.frm' (errno: 150)和sql execution error #1452添加外键时错误解决方法

    Can't create table './store/#sql-b2c_1a.frm' (errno: 150)解决方法 错误原因有四: 1.外键的引用类型不一样,主键是int外键是char 2.找 ...

  7. sphinx网址

    http://www.phperz.com/article/14/0615/95.htmlhttp://www.kuqin.com/shuoit/20141101/342963.htmlhttp:// ...

  8. 【iCore3 双核心板】例程十八:USB_VCP实验——虚拟串口

    实验指导书及代码包下载: http://pan.baidu.com/s/1c1erqIc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. eclipse工程加入jquery.min.js报错:missing semicolon

    1,注释修改项目目录下的.project文件 <?xml version="1.0" encoding="UTF-8"?> <projectD ...

  10. PHP关于依赖注入(控制反转)的解释和例子说明

    PHP关于依赖注入(控制反转)的解释和例子说明 发表于2年前(2014-03-20 10:12)   阅读(726) | 评论(1) 8人收藏此文章, 我要收藏 赞2 阿里云双11绽放在即 1111 ...