- 浏览: 1212751 次
- 性别:
- 来自: 广州
博客专栏
-
Apache CXF使用s...
浏览量:109869
文章分类
- 全部博客 (189)
- Spring (13)
- Hibernate (10)
- liferay portal (3)
- Java (18)
- 数据库 (32)
- JS (12)
- Eclipse (16)
- Log4j (3)
- 我的收藏夹 (8)
- FF and IE (2)
- Groovy Grails (0)
- Web Service (16)
- Quartz (6)
- Tomcat (8)
- Linux (4)
- xml (4)
- Silverlight (1)
- Flex (10)
- JBoss (4)
- EJB (2)
- WAS(webSphere) (5)
- DOS命令 (2)
- JSON (2)
- Maven (1)
- OThers (1)
- SVN (1)
- iBatis (4)
- OS (1)
- 问题解决 (8)
- 待看文章 (2)
- 多线程 (2)
- 代码收藏(即拿即用工具类) (5)
- Socket (2)
- Android (4)
- 其他 (1)
- python (1)
- Genymotion (1)
最新评论
-
a807966224:
还是 多谢楼主 总结的挺好的 !!!
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
然后 通过 SOAPMessage.getHeader(qna ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
我也是接触这东西不久,QName qname = new QN ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
楼主 不知道你有没有出现 从headers 里取出来长 ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
xdc0209:
兄弟呀,报错啦 2011-12-15 13:27:15 n ...
Hibernate+EhCache配置二级缓存
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
- 博客分类:
- Web Service
下面具体的webservice实现类直接用的是上面的,这里不再说明
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); // 超时时间设置 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) obj; //下面这行代码是具体调用服务段的deleteTeskTask() CallResult cResult = service.deleteTeskTask("1223"); ##########这段代码可替代步骤(四)##### 到此全部工作结束 具体一些概念还请自己baidu/google
评论
16 楼
a807966224
2018-02-07
还是 多谢楼主 总结的挺好的 !!!
15 楼
a807966224
2018-02-07
然后 通过 SOAPMessage.getHeader(qname); 取出相应的 header头信息,用来认证,这样可以避免从 SOAPMessage里取出多个头信息, 认证多次
14 楼
a807966224
2018-02-07
我也是接触这东西不久,QName qname = new QName ("namespace路径", "localpart");
13 楼
a807966224
2018-02-07
楼主 不知道你有没有出现 从headers 里取出来长度为2的头信息, 这样会在一次请求里 出现两次认证 很奇怪啊
12 楼
jiangwenxian
2013-10-29
在log.info(userIdNodes.item(0) + "="
+ userIdNodes.item(0).getTextContent()); 报空指针异常
+ userIdNodes.item(0).getTextContent()); 报空指针异常
11 楼
lloWorld
2013-06-06
您好,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> 这个如何生成的?
<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> 这个如何生成的?
10 楼
q269223
2013-03-15
Caused by: javax.xml.soap.SOAPException: SOAP消息头格式不对哦!
... 27 more
在客户端传输SOAPHeader的时候压根就没传过去。希望楼主可以解释一下。··
... 27 more
在客户端传输SOAPHeader的时候压根就没传过去。希望楼主可以解释一下。··
9 楼
Sev7en_jun
2012-11-04
liuwuhen 写道
你好,楼主你的例子,实验成了吗?
测试ok的
8 楼
liuwuhen
2012-10-30
你好,楼主你的例子,实验成了吗?
7 楼
liuxueping1987
2012-05-07
按照楼主的操作做,在以下代码报异常。
if (null == headers || headers.size() < 1) {
50. throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
51. }
if (null == headers || headers.size() < 1) {
50. throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
51. }
6 楼
wenqxin
2012-01-14
Sev7en_jun 写道
Sev7en_jun 写道
wenqxin 写道
为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单
其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的
PS:不知道那种可以把安全级别设置更高一点??
wss4j 提供了不同安全级别的认证方式,常用的就是usernameToken(用户名和密码),你还可以通过授权文件等方式。
5 楼
Sev7en_jun
2012-01-13
Sev7en_jun 写道
wenqxin 写道
为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单
其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的
PS:不知道那种可以把安全级别设置更高一点??
4 楼
Sev7en_jun
2012-01-13
wenqxin 写道
为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单
其实对于复杂程度都差不多一样,这个部分代码也可以直接通过配置来实现,这里是通过自定义的xml信息来校验,回调函数应该是定死了的
3 楼
wenqxin
2012-01-13
为什么不通过wss4j 提供的回调类进行实现呢,cxf 已经实现了啊。配置会比这个简单
2 楼
Sev7en_jun
2012-01-12
baoyun618 写道
正想学习cxf呢,借楼主好文
过奖了,我也是参考网上资料做的,还很多不清楚 呵呵
1 楼
baoyun618
2012-01-12
正想学习cxf呢,借楼主好文
发表评论
-
解决(CXF):The security token could not be authenticated or authorized
2012-01-16 09:50 47141,使用cxf回调函数,服务端setPassword和客 ... -
CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
2012-01-15 00:37 9130注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF ... -
解决(CXF):SOAPFaultException: Fault occurred while processing
2012-01-04 17:23 22603javax.xml.ws.soap.SOAPFault ... -
CXF 入门: 远程接口调用
2012-01-02 17:15 7863本篇是接着:CXF 入门之接口发布写的,建议先看上篇 ... -
CXF 入门:HelloWorld接口发布
2012-01-02 16:31 6211第一步:在myeclipse中新建一个web项目名为myWs, ... -
使用XFire+Spring构建Web Service
2011-12-01 12:01 1696FROM: http://shuangjianyu.blog. ... -
使用XFire+Spring+Struts构建Web Service及测试
2011-11-30 13:04 2607FROM: http://shade8109.blog.1 ... -
Apache Axis配置文件WSDD详解
2011-11-30 12:37 26129FROM: http://apps.hi.baidu.co ... -
(Axis 入门) 超简单webservice实例
2011-11-30 11:21 2079From: http://user.qzone.qq.com/ ... -
解决:nor any of its super class is known to this context.
2011-10-26 13:38 17835可以参考http://blog.csdn.net/chen_y ... -
WebService CXF学习(进阶篇3):CXF整合Spring框架 .
2011-10-26 13:28 79转载于:http://blog.csdn.net/chen ... -
WebService CXF学习 自定义对象传递(简单JavaBean对象) ..
2011-10-26 13:25 91这一节我们就CXF框架简单的JavaBean对象传递进行讲解。 ... -
WebService处理复杂对象List Map(jdk api jws)
2011-10-26 13:02 8661XFire不用这么做,Apache CXF 只需要指定集合中具 ... -
解决: is not found. Have you run APT to generate them?
2011-10-25 13:15 31666WSSERVLET11: failed to parse ru ... -
WebServices CXF开发常见异常及解决方法
2011-10-25 13:08 3507转载于:http://apps.hi.baidu.com/ ... -
解决:java.util.List does not have a no-arg default constructor.
2011-10-25 13:05 3011详见:http://learning.iteye.com/ad ... -
解决: counts of IllegalAnnotationExceptions and JAXB can't handle interfaces.
2011-10-25 13:02 21846、Caused by: com.sun.xml.bind.v2 ...
相关推荐
CXF源码:CXF_Spring源码 CXF源码:CXF_Spring源码
CXF使用EndpointImpl发布WebService加入拦截器
CXF视频:1、使用CXF实现简单的HelloWorld
CXF入门 -- 第一个简单webService文章对应的代码;原文链接http://blog.csdn.net/neareast/article/details/7714778
CXF视频:2、WSDL结构分析 CXF视频:2、WSDL结构分析
CXF实现SSL安全验证,实现https的WebService
08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器
CXF3.0 Spring3.2 自定义拦截器
Web Service学习-CXF开发Web Service的权限控制(二)
讲解了cxf实现拦截器的原因、核心API及使用方法
CXF 自定义拦截器实现的 webservice安全机制实例工程, 带jar包 ,代码注释详细 内有说明文档, 由于资源过大 ,所以客户端jar包 删除掉了, 只需要把服务端的jar 拷贝到 客户端即可 , 小弟刚刚研究完 CXF 安全 。...
cxf入门例子
apache-cxf-2.4.6.zip
这是一个cxf安全验证的完整实例,直接可以部署到应用服务器中运行。
10.为CXF服务器端添加自定义拦截器进行权限检查
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在...
CXF发布WebService加入拦截器
是一个比较详细的cxf使用项目,里面有矿建搭建,也有cxf的使用,内容比较详细和丰富
13.为CXF与Spring整合发布WebService添加拦截器进行权限控制
spring4+cxf3,因为自己项目要用到接口开发,所以综合现有网上所有教程,终于成功写出能自动注入的demo,这个是含拦截器