如何在cxf中cxf 获取输入输出报文soap报文,工作中

cxf 发送 soap 请求(webService) - CSDN博客
cxf 发送 soap 请求(webService)
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientF
public class CXFClient {
&& &public CXFClient(){}
&& &public& Object[] sendSoap(String wsdlUrl,String hostMethod,Object...params) throws Exception{
&& &&& &JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
&& &&& &Object[] objects = dcf.createClient(wsdlUrl).invoke(hostMethod, params);
调用方法:
cXFClient.sendSoap(wsdlUrl, methodName, param1,param2,...);
cxf需要的包:
cxf-core-3.0.1.jar
cxf-rt-bindings-soap-3.0.1.jar
cxf-rt-databinding-jaxb-3.0.1.jar
cxf-rt-frontend-jaxws-3.0.1.jar
cxf-rt-frontend-simple-3.0.1.jar
cxf-rt-transports-http-3.0.1.jar
cxf-rt-wsdl-3.0.1.jar
stax2-api-3.1.4.jar
woodstox-core-asl-4.4.0.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.1.0.jar
本文已收录于以下专栏:
相关文章推荐
错误信息记录:
14:41:48 org.apache.cxf.phase.PhaseInterceptorChain doIntercept
信息: Interceptor h...
Java WebService-CXF
基于SOAP的Web服务
1  目标:使用XML进行网络交互通信,提供WEB服务,RPC的进...
http://cxf.apache.org/docs/writing-a-service-with-spring.html
版本CXF2.6.9
添加的包文件
    cxf-2.2.10.jar
    jetty-6.1.21.jar
    jetty-util-6.1.21.jar
  &...
1,拷贝依赖包
asm-3.3.1.jar
cxf-2.7.17.jar
geronimo-servlet_3.0_spec-1.0.jar
客户端的简单访问:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.getInInterceptors()...
1.apache cxf-2.4.3导入相关架包:
commons-net-3.3.jar
cxf-2.4.3.jar
geronimo-jaxws_2.2_spec-1.1.jar
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。
    您应当具备的基础知识
    在继续学习之前,您...
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
我的图书馆
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
博客分类:
下面具体的webservice实现类直接用的是上面的,这里不再说明
Java代码 &CXF拦截器使用,创建一个使用SOAPHeader的安全验证&&xml格式:&&&soap:Header&&&&&&&&auth:authentication&xmlns:auth="//authentication"&&&&&&&&&&&&auth:systemID&1&/auth:systemID&&&&&&&&&&&&auth:userID&test&/auth:userID&&&&&&&&&&&&auth:password&test&/auth:password&&&&&&&&/auth:authentication&&&&/soap:Header&&&&&一,首先在服务端创建一个拦截器(被调用端),需要继承org.apache.cxf.phase.AbstractPhaseInterceptor&&代码如下:&&&&import&java.util.L&&&&import&javax.xml.soap.SOAPE&&&&import&org.apache.cxf.binding.soap.SoapH&&import&org.apache.cxf.binding.soap.SoapM&&import&org.apache.cxf.headers.H&&import&org.apache.cxf.helpers.XMLU&&import&org.apache.cxf.interceptor.F&&import&org.apache.cxf.phase.AbstractPhaseI&&import&org.apache.cxf.phase.P&&import&org.apache.log4j.L&&import&org.w3c.dom.E&&import&org.w3c.dom.NodeL&&&&&&public&class&AuthIntercetpr&extends&AbstractPhaseInterceptor&SoapMessage&&{&&&&&&private&static&final&Logger&logger&=&Logger.getLogger(AuthIntercetpr.class);&&&&&&public&static&final&String&xml_namespaceUR_att&=&"//authentication";&&&&&&public&static&final&String&xml_header_el&=&"soap:Header";&&&&&&public&static&final&String&xml_authentication_el&=&"auth:authentication";&&&&&&public&static&final&String&xml_systemID_el&=&"auth:systemID";&&&&&&public&static&final&String&xml_userID_el&=&"auth:userID";&&&&&&public&static&final&String&xml_password_el&=&"auth:password";&&&&&&public&AuthIntercetpr()&{&&&&&&&&&&//&指定该拦截器在哪个阶段被激发&&&&&&&&&&super(Phase.PRE_INVOKE);&&&&&&}&&&&&&&&//&处理消息&&&&&&public&void&handleMessage(SoapMessage&message)&{&&&&&&&&&&("==================SoapMessage&="&+&message);&&&&&&&&&&//&获取SOAP消息的全部头&&&&&&&&&&List&Header&&headers&=&message.getHeaders();&&&&&&&&&&&&if&(null&==&headers&||&headers.size()&&&1)&{&&&&&&&&&&&&&&throw&new&Fault(new&SOAPException("SOAP消息头格式不对哦!"));&&&&&&&&&&}&&&&&&&&&&for&(Header&header&:&headers)&{&&&&&&&&&&&&&&SoapHeader&soapHeader&=&(SoapHeader)&&&&&&&&&&&&&&&//&取出SOAP的Header元素&&&&&&&&&&&&&&Element&element&=&(Element)&soapHeader.getObject();&&&&&&&&&&&&&&("ELEMENT&="&+&element.toString());&&&&&&&&&&&&&&XMLUtils.printDOM(element);&&&&&&&&&&&&&&NodeList&userIdNodes&=&element&&&&&&&&&&&&&&&&&&&&&&.getElementsByTagName(xml_userID_el);&&&&&&&&&&&&&&NodeList&pwdNodes&=&element&&&&&&&&&&&&&&&&&&&&&&.getElementsByTagName(xml_password_el);&&&&&&&&&&&&&&NodeList&systemIdNodes&=&element&&&&&&&&&&&&&&&&&&&&&&.getElementsByTagName(xml_systemID_el);&&&&&&&&&&&&&&("############&打印帐号信息&##############");&&&&&&&&&&&&&&(userIdNodes.item(0)&+&"="&&&&&&&&&&&&&&&&&&&&&&+&userIdNodes.item(0).getTextContent());&&&&&&&&&&&&&&(systemIdNodes.item(0)&+&"="&&&&&&&&&&&&&&&&&&&&&&+&systemIdNodes.item(0).getTextContent());&&&&&&&&&&&&&&(pwdNodes.item(0)&+&"="&&&&&&&&&&&&&&&&&&&&&&+&pwdNodes.item(0).getTextContent());&&&&&&&&&&&&&&("############————————##############");&&&&&&&&&&&&&&if&(null&!=&userIdNodes&&&&&&&&&&&&&&&&&&&&&&&&&userIdNodes.item(0).getTextContent().equels("test")&)&{&&&&&&&&&&&&&&&&&&if&(null&!=&pwdNodes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pwdNodes.item(0).getTextContent().equals("test"))&{&&&&&&&&&&&&&&&&&&&&&&("$$$$$$$$&认证成功");&&&&&&&&&&&&&&&&&&}&else&{//认证失败则抛出异常,停止继续操作&&&&&&&&&&&&&&&&&&&&&&SOAPException&soapExc&=&new&SOAPException("阁下可能不是合法用户!");&&&&&&&&&&&&&&&&&&&&&&throw&new&Fault(soapExc);&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&}&else&{//认证失败则抛出异常,停止继续操作&&&&&&&&&&&&&&&&&&SOAPException&soapExc&=&new&SOAPException("阁下可能不是合法用户!");&&&&&&&&&&&&&&&&&&throw&new&Fault(soapExc);&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&}&&}&&&&二,修改cxf-beans.xml&&&&&!--id:随意配,implementor:指定接口具体实现类,address:随意配,访问时会用到,下面会做说明--&&&&!--拦截器--&&&&bean&id="authIntercetpr"&class="unitTest.AuthIntercetpr"&&/bean&&&&jaxws:endpoint&id="HelloWorldService"&implementor="com.ws.HelloWorldServiceImpl"&&&&&&&&&&address="/IHelloService"&&&&&&&&&&&&!--&在此配置调用当前ws所触发的拦截器--&&&&&&&&&&&&jaxws:inInterceptors&&ref&bean="authIntercetpr"&/&&/bean&&&&&&&&&&&&&&&&&&&&&&&&&&&!--或者直接在这里写&bean&&class="unitTest.AuthIntercetpr"&&/bean&--&&&&&&&&&&&&/jaxws:inInterceptors&&&&/jaxws:endpoint&&&&&到此服务端工作完毕!!!&&下面是客户端(调用端)&&三,这边同样创建一个拦截器,实现org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor&&&&import&java.text.SimpleDateF&&import&java.util.D&&import&java.util.L&&&&import&javax.xml.namespace.QN&&&&import&org.apache.cxf.binding.soap.SoapH&&import&org.apache.cxf.binding.soap.SoapM&&import&org.apache.cxf.binding.soap.interceptor.AbstractSoapI&&import&org.apache.cxf.headers.H&&import&org.apache.cxf.helpers.DOMU&&import&org.apache.cxf.helpers.XMLU&&import&org.apache.cxf.interceptor.F&&import&org.apache.cxf.phase.P&&import&org.w3c.dom.D&&import&org.w3c.dom.E&&&&public&class&AddSoapHeader&extends&AbstractSoapInterceptor&{&&&&&&&&public&static&final&String&xml_namespaceUR_att&=&"//authentication";&&&&&&public&static&final&String&xml_header_el&=&"soap:Header";&&&&&&public&static&final&String&xml_authentication_el&=&"auth:authentication";&&&&&&public&static&final&String&xml_systemID_el&=&"auth:systemID";&&&&&&public&static&final&String&xml_userID_el&=&"auth:userID";&&&&&&public&static&final&String&xml_password_el&=&"auth:password";&&&&&&&&public&AddSoapHeader()&{&&&&&&//&指定该拦截器在哪个阶段被激发&&&&&&&&&&super(Phase.WRITE);&&&&&&}&&&&&&&&public&void&handleMessage(SoapMessage&message)&throws&Fault&{&&&&&&&&&&SimpleDateFormat&sd&=&new&SimpleDateFormat("yyyy-MM-dd&HH:mm:ss");&&&&&&&&&&Date&date&=&new&Date();&&&&&&&&&&String&time&=&sd.format(date);&&&&&&&&&&String&userId&=&"test";&&&&&&&&&&String&sysId&=&"1";&&&&&&&&&&String&password&=&"test";&&&&&&&&&&&&QName&qname&=&new&QName("RequestSOAPHeader");//这个值暂时不清楚具体做什么用,可以随便写&&&&&&&&&&&&Document&doc&=&(Document)&DOMUtils.createDocument();&&&&&&&&&&Element&root&=&doc.createElement(xml_header_el);&&&&&&&&&&Element&eSysId&=&doc.createElement(xml_systemID_el);&&&&&&&&&&eSysId.setTextContent(sysId);&&&&&&&&&&Element&eUserId&=&doc.createElement(xml_userID_el);&&&&&&&&&&eUserId.setTextContent(userId);&&&&&&&&&&Element&ePwd&=&doc.createElement(xml_password_el);&&&&&&&&&&ePwd.setTextContent(password);&&&&&&&&&&Element&child&=&doc.createElementNS(xml_namespaceUR_att,&&&&&&&&&&&&&&&&&&xml_authentication_el);&&&&&&&&&&child.appendChild(eSysId);&&&&&&&&&&child.appendChild(eUserId);&&&&&&&&&&child.appendChild(ePwd);&&&&&&&&&&root.appendChild(child);&&&&&&&&&&XMLUtils.printDOM(root);//&只是打印xml内容到控制台,可删除&&&&&&&&&&SoapHeader&head&=&new&SoapHeader(qname,&root);&&&&&&&&&&List&Header&&headers&=&message.getHeaders();&&&&&&&&&&headers.add(head);&&&&&&&&&&&&&&&&}&&&&}&&&&四,具体调用ws的类代码&&&&&&&&&&private&static&final&String&webServiceConTimeout&=&"6000";&&&&&&private&static&final&String&webServiceRevTimeout&=&"6000";&&&&&&。。。。。。。&&&&&&&&&&HelloWorldServiceImplService&hello&=&new&HelloWorldServiceImplService();&&&&&&&&&&&&HelloWorldService&service&=&hello.getHelloWorldServiceImplPort();&&&&&&&&&&//以上什么意思请参考:/admin/blogs/1333223&&&&&&&&&&Client&clientProxy&=&ClientProxy.getClient(service);//通过目标ws获取代理&&&&&&&&&&//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发&&&&&&&&&&clientProxy.getOutInterceptors().add(ash);&&&&&&&&&&//&超时时间设置&&&&&&&&&&HTTPConduit&http&=&(HTTPConduit)&clientProxy.getConduit();&&&&&&&&&&HTTPClientPolicy&httpClientPolicy&=&new&HTTPClientPolicy();&&&&&&&&&&httpClientPolicy.setConnectionTimeout(Integer&&&&&&&&&&&&&&&&&&.valueOf(webServiceConTimeout));&&&&&&&&&&httpClientPolicy.setReceiveTimeout(Integer&&&&&&&&&&&&&&&&&&.valueOf(webServiceRevTimeout));&&&&&&&&&&httpClientPolicy.setAllowChunking(false);&&&&&&&&&&http.setClient(httpClientPolicy);&&&&&&&&&&//以上插入点超时设置方式&&&&&&&&&&//下面这行代码是具体调用服务段的deleteTeskTask()&&&&&&&&&&CallResult&cResult&=&service.deleteTeskTask("1223");&&&&&&&&&&&&&&&&&&&&&&&&&&&&。&&&&&&&&&&。&&&&&&&&&&&&客户端代码到此结束&&&&五,还有一种方式是通过JaxWsProxyFactoryBean方式,注册拦截器及实例化ws,代码如下:&&&&private&static&final&JaxWsProxyFactoryBean&factory&=&new&JaxWsProxyFactoryBean();&&&&AddSoapHeader&ash&=&new&AddSoapHeader();&&&&&&&&&&ArrayList&list&=&new&ArrayList();&&&&&&&&&&//&添加soap&header&信息&&&&&&&&&&list.add(ash);&&&&&&&&&&//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发&&&&&&&&&&&factory.setOutInterceptors(list);&&&&&&&&&&&factory.setServiceClass(HelloWorldService.class);//实例化ws&&&&&&&&&&&factory.setAddress("http://xxx.xxx.xxx.xxx:8004/services/IHelloService");&&&&&&&&&&&Object&obj&=&factory.create();&&&&&&&&&&&HelloWorldService&service&=&(HelloWorldService)&&&&&&&&&&&&//下面这行代码是具体调用服务段的deleteTeskTask()&&&&&&&&&&CallResult&cResult&=&service.deleteTeskTask("1223");&&&&&&&&&&&&##########这段代码可替代步骤(四)#####&&&&到此全部工作结束&&具体一些概念还请自己baidu/google &
TA的最新馆藏
喜欢该文的人也喜欢博客分类:
下面具体的webservice实现类直接用的是上面的,这里不再说明
CXF拦截器使用,创建一个使用SOAPHeader的安全验证
&soap:Header&
&auth:authentication xmlns:auth="//authentication"&
&auth:systemID&1&/auth:systemID&
&auth:userID&test&/auth:userID&
&auth:password&test&/auth:password&
&/auth:authentication&
&/soap:Header&
一,首先在服务端创建一个拦截器(被调用端),需要继承org.apache.cxf.phase.AbstractPhaseInterceptor
代码如下:
import java.util.L
import javax.xml.soap.SOAPE
import org.apache.cxf.binding.soap.SoapH
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.headers.H
import org.apache.cxf.helpers.XMLU
import org.apache.cxf.interceptor.F
import org.apache.cxf.phase.AbstractPhaseI
import org.apache.cxf.phase.P
import org.apache.log4j.L
import org.w3c.dom.E
import org.w3c.dom.NodeL
public class AuthIntercetpr extends AbstractPhaseInterceptor&SoapMessage& {
private static final Logger logger = Logger.getLogger(AuthIntercetpr.class);
public static final String xml_namespaceUR_att = "//authentication";
public static final String xml_header_el = "soap:Header";
public static final String xml_authentication_el = "auth:authentication";
public static final String xml_systemID_el = "auth:systemID";
public static final String xml_userID_el = "auth:userID";
public static final String xml_password_el = "auth:password";
public AuthIntercetpr() {
// 指定该拦截器在哪个阶段被激发
super(Phase.PRE_INVOKE);
// 处理消息
public void handleMessage(SoapMessage message) {
("==================SoapMessage =" + message);
// 获取SOAP消息的全部头
List&Header& headers = message.getHeaders();
if (null == headers || headers.size() & 1) {
throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
for (Header header : headers) {
SoapHeader soapHeader = (SoapHeader)
// 取出SOAP的Header元素
Element element = (Element) soapHeader.getObject();
("ELEMENT =" + element.toString());
XMLUtils.printDOM(element);
NodeList userIdNodes = element
.getElementsByTagName(xml_userID_el);
NodeList pwdNodes = element
.getElementsByTagName(xml_password_el);
NodeList systemIdNodes = element
.getElementsByTagName(xml_systemID_el);
("############ 打印帐号信息 ##############");
(userIdNodes.item(0) + "="
+ userIdNodes.item(0).getTextContent());
(systemIdNodes.item(0) + "="
+ systemIdNodes.item(0).getTextContent());
(pwdNodes.item(0) + "="
+ pwdNodes.item(0).getTextContent());
("############————————##############");
if (null != userIdNodes
&& userIdNodes.item(0).getTextContent().equels("test") ) {
if (null != pwdNodes
&& pwdNodes.item(0).getTextContent().equals("test")) {
("$$$$$$$$ 认证成功");
} else {//认证失败则抛出异常,停止继续操作
SOAPException soapExc = new SOAPException("阁下可能不是合法用户!");
throw new Fault(soapExc);
} else {//认证失败则抛出异常,停止继续操作
SOAPException soapExc = new SOAPException("阁下可能不是合法用户!");
throw new Fault(soapExc);
二,修改cxf-beans.xml
&!--id:随意配,implementor:指定接口具体实现类,address:随意配,访问时会用到,下面会做说明--&
&!--拦截器--&
&bean id="authIntercetpr" class="unitTest.AuthIntercetpr"&&/bean&
&jaxws:endpoint id="HelloWorldService" implementor="com.ws.HelloWorldServiceImpl"
address="/IHelloService"&
&!-- 在此配置调用当前ws所触发的拦截器--&
&jaxws:inInterceptors&&ref bean="authIntercetpr" /&&/bean&
&!--或者直接在这里写&bean
class="unitTest.AuthIntercetpr"&&/bean&--&
&/jaxws:inInterceptors&
&/jaxws:endpoint&
到此服务端工作完毕!!!
下面是客户端(调用端)
三,这边同样创建一个拦截器,实现org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor
import java.text.SimpleDateF
import java.util.D
import java.util.L
import javax.xml.namespace.QN
import org.apache.cxf.binding.soap.SoapH
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.binding.soap.interceptor.AbstractSoapI
import org.apache.cxf.headers.H
import org.apache.cxf.helpers.DOMU
import org.apache.cxf.helpers.XMLU
import org.apache.cxf.interceptor.F
import org.apache.cxf.phase.P
import org.w3c.dom.D
import org.w3c.dom.E
public class AddSoapHeader extends AbstractSoapInterceptor {
public static final String xml_namespaceUR_att = "//authentication";
public static final String xml_header_el = "soap:Header";
public static final String xml_authentication_el = "auth:authentication";
public static final String xml_systemID_el = "auth:systemID";
public static final String xml_userID_el = "auth:userID";
public static final String xml_password_el = "auth:password";
public AddSoapHeader() {
// 指定该拦截器在哪个阶段被激发
super(Phase.WRITE);
public void handleMessage(SoapMessage message) throws Fault {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
String time = sd.format(date);
String userId = "test";
String sysId = "1";
String password = "test";
QName qname = new QName("RequestSOAPHeader");//这个值暂时不清楚具体做什么用,可以随便写
Document doc = (Document) DOMUtils.createDocument();
Element root = doc.createElement(xml_header_el);
Element eSysId = doc.createElement(xml_systemID_el);
eSysId.setTextContent(sysId);
Element eUserId = doc.createElement(xml_userID_el);
eUserId.setTextContent(userId);
Element ePwd = doc.createElement(xml_password_el);
ePwd.setTextContent(password);
Element child = doc.createElementNS(xml_namespaceUR_att,
xml_authentication_el);
child.appendChild(eSysId);
child.appendChild(eUserId);
child.appendChild(ePwd);
root.appendChild(child);
XMLUtils.printDOM(root);// 只是打印xml内容到控制台,可删除
SoapHeader head = new SoapHeader(qname, root);
List&Header& headers = message.getHeaders();
headers.add(head);
四,具体调用ws的类代码
private static final String webServiceConTimeout = "6000";
private static final String webServiceRevTimeout = "6000";
。。。。。。。
HelloWorldServiceImplService hello = new HelloWorldServiceImplService();
HelloWorldService service = hello.getHelloWorldServiceImplPort();
//以上什么意思请参考:/admin/blogs/1333223
Client clientProxy = ClientProxy.getClient(service);//通过目标ws获取代理
//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
clientProxy.getOutInterceptors().add(ash);
// 超时时间设置
HTTPConduit http = (HTTPConduit) clientProxy.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(Integer
.valueOf(webServiceConTimeout));
httpClientPolicy.setReceiveTimeout(Integer
.valueOf(webServiceRevTimeout));
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);
//以上插入点超时设置方式
//下面这行代码是具体调用服务段的deleteTeskTask()
CallResult cResult = service.deleteTeskTask("1223");
客户端代码到此结束
五,还有一种方式是通过JaxWsProxyFactoryBean方式,注册拦截器及实例化ws,代码如下:
private static final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
AddSoapHeader ash = new AddSoapHeader();
ArrayList list = new ArrayList();
// 添加soap header 信息
list.add(ash);
//注入拦截器,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
factory.setOutInterceptors(list);
factory.setServiceClass(HelloWorldService.class);//实例化ws
factory.setAddress("http://xxx.xxx.xxx.xxx:8004/services/IHelloService");
Object obj = factory.create();
HelloWorldService service = (HelloWorldService)
//下面这行代码是具体调用服务段的deleteTeskTask()
CallResult cResult = service.deleteTeskTask("1223");
##########这段代码可替代步骤(四)#####
到此全部工作结束
具体一些概念还请自己baidu/google
浏览 10623
你好,楼主你的例子,实验成了吗?
测试ok的
Sev7en_jun 写道wenqxin 写道为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的PS:不知道那种可以把安全级别设置更高一点??wss4j 提供了不同安全级别的认证方式,常用的就是usernameToken(用户名和密码),你还可以通过授权文件等方式。
wenqxin 写道为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的PS:不知道那种可以把安全级别设置更高一点??
为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的
正想学习cxf呢,借楼主好文过奖了,我也是参考网上资料做的,还很多不清楚 呵呵
Sev7en_jun
浏览: 746412 次
来自: 广州
浏览量:70980
兄弟呀,报错啦
13:27:15 n ...
谢谢博主资料收集。
今天我也遇到这个问题了,情况是本机调试正常,项目发布到linu ...
这个方法有点简单粗暴。希望能有个将本来不识别的单词加入词典的功 ...
写的很清晰。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'博客分类:
CXF提供了Interceptor拦截器链对SOAP消息进行拦截处理
拦截器分为不同的Phase,各个Phase又有自己的拦截器链,参考http://cxf.apache.org/docs/interceptors.html
在客户端加入头信息
头信息为一个字符串
编写interceptor
PHASE:WRITE
package com.hqh.ws.cxf.
import java.util.L
import javax.xml.bind.JAXBE
import javax.xml.namespace.QN
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.binding.soap.interceptor.AbstractSoapI
import org.apache.cxf.databinding.DataB
import org.apache.cxf.headers.H
import org.apache.cxf.interceptor.F
import org.apache.cxf.jaxb.JAXBDataB
import org.apache.cxf.phase.P
public class LicenseOutInterceptor extends AbstractSoapInterceptor{
* 指定加入拦截器到某个阶段
* @param p
public LicenseOutInterceptor() {
super(Phase.WRITE);
public void handleMessage(SoapMessage message) throws Fault {
List&Header& headers = message.getHeaders();
//创建QName
String namespaceURI = "http://ws.";
String localPart = "license";
String prefix = "ns";
QName qname = new QName(namespaceURI, localPart, prefix);
//创建需要使用header进行传输的对象
String sendObj = "license for webservice";
//创建DataBinding
DataBinding dataBinding = new JAXBDataBinding(String.class);
//创建Header
Header header = new Header(qname, sendObj, dataBinding);
//将header加入到SOAP头集合中
headers.add(header);
} catch (JAXBException e) {
e.printStackTrace();
throw new Fault(e);
调用服务时加入interceptor
* 使用interceptor加入header
public void test03() {
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IMyService.class);
factory.setAddress("http://localhost:8888/cxf/ws?wsdl");
//打印发出的消息
factory.getOutInterceptors().add(new LoggingOutInterceptor());
//加入自定义的拦截器
factory.getOutInterceptors().add(new LicenseOutInterceptor());
//获取服务对象
IMyService service = (IMyService)factory.create();
//调用服务
String reply = service.sayHello("李思思");
System.out.println(reply);
System.exit(0);
头信息为一个对象
package com.hqh.ws.cxf.
public class User {
public User() {
public User(String name, String pwd) {
this.name =
this.pwd =
public String getName() {
public void setName(String name) {
this.name =
public String getPwd() {
public void setPwd(String pwd) {
this.pwd =
package com.hqh.ws.cxf.
import java.util.L
import javax.xml.bind.JAXBE
import javax.xml.namespace.QN
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.binding.soap.interceptor.AbstractSoapI
import org.apache.cxf.databinding.DataB
import org.apache.cxf.headers.H
import org.apache.cxf.interceptor.F
import org.apache.cxf.jaxb.JAXBDataB
import org.apache.cxf.phase.P
import com.hqh.ws.cxf.model.U
public class LicenseOutInterceptor extends AbstractSoapInterceptor{
* 指定加入拦截器到某个阶段
* @param p
public LicenseOutInterceptor() {
super(Phase.WRITE);
public void handleMessage(SoapMessage message) throws Fault {
List&Header& headers = message.getHeaders();
//创建QName
String namespaceURI = "http://ws.";
String localPart = "license";
String prefix = "ns";
QName qname = new QName(namespaceURI, localPart, prefix);
//创建需要使用header进行传输的对象
//String sendObj = "license for webservice";
//头信息为一个对象
User user = new User("admin","admin1");
//创建DataBinding
//DataBinding dataBinding = new JAXBDataBinding(String.class);
DataBinding dataBinding = new JAXBDataBinding(User.class);
//创建Header
//Header header = new Header(qname, sendObj, dataBinding);
Header header = new Header(qname, user, dataBinding);
//将header加入到SOAP头集合中
headers.add(header);
} catch (JAXBException e) {
e.printStackTrace();
throw new Fault(e);
客户端发出的SOAP消息
&soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"&
&soap:Header&
&ns:license xmlns:ns="http://ws."&
&name&admin&/name&
&pwd&admin1&/pwd&
&/ns:license&
&/soap:Header&
&soap:Body&
&ns2:sayHello xmlns:ns2="http://cxf./"&
&name&李思思&/name&
&/ns2:sayHello&
&/soap:Body&
&/soap:Envelope&
服务端使用拦截器获取头信息
PHASE:UNMARSHALLER
package com.hqh.ws.cxf.
import java.util.L
import javax.xml.bind.JAXBE
import javax.xml.soap.SOAPE
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.binding.soap.interceptor.AbstractSoapI
import org.apache.cxf.databinding.DataB
import org.apache.cxf.headers.H
import org.apache.cxf.interceptor.F
import org.apache.cxf.jaxb.JAXBDataB
import org.apache.cxf.phase.P
import org.w3c.dom.E
import com.hqh.ws.cxf.model.U
public class licenseInIntercptor extends AbstractSoapInterceptor{
* 指定拦截器使用的阶段
* 这里是服务端对header的拦截处理,指定到UNMARSHAL阶段
* 注意:不要指定到READ阶段,READ阶段获取到的是xml数据,还不能从message对象中获取到header的相关信息
* 在unmarshaller将xml转换为对象之后使用拦截器,才能从header对象中获取到数据
* @param p
public licenseInIntercptor() {
super(Phase.UNMARSHAL);
public void handleMessage(SoapMessage message) throws Fault {
//获取所有的header
List&Header& headers = message.getHeaders();
System.out.println("headers size:"+headers.size());
//服务端能通过DataBinding进行对象的自动转换吗?在read/unmarshaller时加入?
//DataBinding binding = new JAXBDataBinding(User.class);
for(Header head : headers) {
String localPart = head.getName().getLocalPart();
System.out.println("当前头信息节点名称:"+localPart);
if("license".equals(localPart)) {
//获取cxf拦截器转换得到的头信息对象
Object obj = head.getObject();
//注意:这里获取到的obj并不是客户端指定的User对象!
System.out.println(obj instanceof User);
Element element = (Element)
String name = element.getElementsByTagName("name").item(0).getTextContent();
String pwd = element.getElementsByTagName("pwd").item(0).getTextContent();
if("admin".equals(name) && "admin".equals(pwd)) {
System.out.println("验证成功");
SOAPException ex = new SOAPException("认证信息错误!");
throw new Fault(ex);
} catch (Exception e) {
//e.printStackTrace();
throw new Fault(e);
服务端发布服务时加入指定的拦截器
* 使用CXF发布服务
public static void startServerByCXF() {
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(IMyService.class);
svrFactory.setAddress("http://localhost:8888/cxf/ws");
svrFactory.setServiceBean(new MyServiceImpl());
//打印进入的消息
svrFactory.getInInterceptors().add(new LoggingInInterceptor());
//打印发出的消息
svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
* 加入服务端的Handler处理客户端传递的头信息
List&Handler& handlers = new ArrayList&Handler&();
handlers.add(new LicenseHandler());
svrFactory.setHandlers(handlers);
* 加入对头信息的拦截器
svrFactory.getInInterceptors().add(new licenseInIntercptor());
svrFactory.create();
浏览: 94441 次
来自: 广州
为什么还是没有~
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 cxf soap 的文章

 

随机推荐