问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

cxf 用asm5.0为什么会报spring创建异常

发布网友 发布时间:2022-05-10 20:41

我来回答

1个回答

热心网友 时间:2023-10-30 04:24

下面具体的webservice实现类直接用的是上面的,这里不再说明

Java代码
CXF*使用,创建一个使用SOAPHeader的安全验证
xml格式:
<soap:Header>
<auth:authentication xmlns:auth="http://gd.chinamobile.com//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.List;

import javax.xml.soap.SOAPException;

import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class AuthIntercetpr extends AbstractPhaseInterceptor<SoapMessage> {
private static final Logger logger = Logger.getLogger(AuthIntercetpr.class);
public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//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) {
logger.info("==================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) header;
// 取出SOAP的Header元素
Element element = (Element) soapHeader.getObject();
logger.info("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);
logger.info("############ 打印帐号信息 ##############");
logger.info(userIdNodes.item(0) + "="
+ userIdNodes.item(0).getTextContent());
logger.info(systemIdNodes.item(0) + "="
+ systemIdNodes.item(0).getTextContent());
logger.info(pwdNodes.item(0) + "="
+ pwdNodes.item(0).getTextContent());
logger.info("############————————##############");
if (null != userIdNodes
&& userIdNodes.item(0).getTextContent().equels("test") ) {
if (null != pwdNodes
&& pwdNodes.item(0).getTextContent().equals("test")) {
logger.info("$$$$$$$$ 认证成功");
} 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.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.helpers.XMLUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddSoapHeader extends AbstractSoapInterceptor {

public static final String xml_namespaceUR_att = "http://gd.chinamobile.com//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();
//以上什么意思请参考:http://learning.iteye.com/admin/blogs/1333223
Client clientProxy = ClientProxy.getClient(service);//通过目标ws获取代理
//注入*,getOutInterceptors代表调用服务端时触发,getInInterceptors就是被调用才触发
clientProxy.getOutInterceptors().add(ash);
// 超时时间设置
HTTPConit http = (HTTPConit) clientProxy.getConit();
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) obj;
//下面这行代码是具体调用服务段的deleteTeskTask()
CallResult cResult = service.deleteTeskTask("1223");

##########这段代码可替代步骤(四)#####

到此全部工作结束
具体一些概念还请自己/google
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
路上捡到一只小狗,请各位大侠鉴定下什么品种。好知道她的习性、好喂养... ...请各位大侠说说他是什么品种狗狗,成年后会多大?谢谢! 麻烦各位大侠能帮我看看这狗是什么品种的狗吗?包括生活习性,血统智商... 求鉴定这是什么品种的小狗...谢谢了。前几天刚买的 各位大侠,请问下面这个小狗叫什么名字 家庭用的开关有多少种怎么用 智能开关安装和普通开关安装的区别 美国缔造者,洛克菲勒家族是如何百年不衰的? 亿万富豪,犹太人洛克菲勒:让自己变聪明的人,有3个“愚蠢” 改病句:汽车质量的好坏,也是保证行车安全的一个很重要条件。 ssh搭的服务器,现在公司要.net做客户端,二者通讯,并且如何安全验证 java调用.NetWebService的问题. java写webservice客户端,用Axis方式实现,怎么在头部加上wss4j简单的USERNAME_TOKEN验证? java开发WebService服务端,用什么最好,各种技术的区别是什么 使用JAX-RS开发REST方式的webservice怎么样实现安全验证 用BB FlashBack录制的视频 在保存时候电脑卡掉了,然后软件就被关了,最后在电脑里找到被明明为 安装BB Flashback PRO汉化版怎么覆盖原文件?请截图告诉我,感谢,感谢 webservice怎么安全验证 信息安全等级保护管理办法的介绍 急急急,问一下高考后出国留学的途径有哪些? 怎样才能高考后出国留学? scofield男装 专柜 南昌 比较好吃的牛肉干的牌子有哪些?最好是辣味的 一岁婴儿喝奶粉后绿色大便 我家饮水机上的大水桶摔了进去,有个大窝,怎么办呢 我家的饮水机把水桶放上去,之后水就从机器下面流出来,那位高手指点下 ! 坐飞机能否带充电宝 早上是先运动好还是先喝牛奶好 还有晚上呢?? 早上起来运动是先吃饭还是先运动 早上应该是先运动还是先吃饭 如何使用CXF发布HTTPS,且接受所有证书 c#程序与web服务(访问数据库需要) 如何不被抓包软件 抓取到通信数据?(xml) 我想在电脑上画画,可找不到那个画画的笔,在电脑的哪个地方有那个绘画的工具吗?请高手指教。谢谢。 caj电脑显示览激光笔在哪里 股票出半年度报告是利好还是利空? 1线城市和2线城市有啥区别 牦牛肉干什么牌子好 素食腌笃鲜怎么做 thinkpad 官方最小三款电源适配器,哪种最好 求助一个ThinkPad 电源适配器的问题 洗澡的水龙头叫啥 请问联想thinkpadE435 3265 A28笔记本电脑电源适配器是20V多少安的啊? 我的thinkpad电源适配器出问题了 怎样下载《我和你一样》手语MV李宇春的 水龙头有什么不同的分类 求李宇春《和你一样》手语舞视频 寻求李宇春《和你一样》MV 手机下载地址 李宇春的《和你一样》,周慧的《我很快乐》mv的ktv版本 水龙头是什么生肖? 求《和你一样》mv消音版