webservice调用服务端数据时给soapenv:Envelope 添加自定义的命名空间
最近做第三方接口,服务端需要
<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 添加自定义的命名空间的更多相关文章
- android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据
主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...
- Webservice客户端动态调用服务端功能方法
一.发布WebService服务 方式一:在服务端生成wsdl文件,下方客户端直接引用即可 优点:针对要发布的方法生成一个wsdl文件即可,无需多余配置. 缺点:每次服务端方法发生改变都需 ...
- [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端
原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...
- .Net Mvc3框架调用服务端控件解决方案
/*BY:Wangyexin date:2011年4月30日 20:17:38*/ /*说明:.net mvc3框架,View层调用服务端控件,输出到.cshtml文件中显示*/ 1.先说说.ne ...
- 网站的优化----首页优化---app调取服务端数据
高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...
- 使用DWR实现JS调用服务端Java代码
DWR简介 DWR全称Direct Web Remoting,是一款非常优秀的远程过程调用(Remote Procedure Call)框架,通过浏览器提供的Ajax引擎实现在前端页面的JS代码中调用 ...
- python的flex服务端数据接口开发
python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...
- WebService调用一对多关联关系时出现 死循环:A cycle is detected in...
通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...
- 服务端渲染时无法获得环境变量的值,一直是undefined
1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie
随机推荐
- Oracle 建立索引及SQL优化
数据库索引: 索引有单列索引,复合索引之说,如果某表的某个字段有主键约束和唯一性约束,则Oracle 则会自动在相应的约束列上建议唯一索引.数据库索引主要进行提高访问速度. 建设原则: 1.索引应该经 ...
- 让你的APP支持iPhone5
让你的APP支持iPhone5 前言 国庆节前,为了支持 iPhone5 的屏幕分辨率 (640 象素 x 1136 象素),我尝试着升级粉笔网 iPhone 客户端.整个过程花了大概一天的时间,我把 ...
- 【hihoCoder】1041. 国庆出游
问题:详见http://hihocoder.com/problemset/problem/1041 有n个城市,城市编号为1-n,城市间有n-1条路(所以,城市路网是一棵树).给定一个序列S,要求判断 ...
- Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 解决方法
Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds. If the server requires ...
- jquery中对动态生成的标签响应click事件(二)…与ajax交互使用
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncodin ...
- bzoj4518: [Sdoi2016]征途--斜率DP
题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...
- js的extend和fn.extend使用
$.fn.extend扩展的是一个jQuery对象函数,$.extend扩展的是一个jQuery全局函数 <!DOCTYPE html> <html> <head> ...
- ajaxfileupload.js
jQuery.extend({ createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' ...
- C++ STL
1.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...