- 浏览: 216031 次
- 性别:
- 来自: 哈尔滨
文章分类
最新评论
-
lizhenzhendebishe:
提示An error was discovered proce ...
WebService:Axis客户端调用需要身份验证的CXF服务 -
yuanliangding:
学习了。不太接触底层的东西
UNIX系统的IO模型 -
_copythat:
加油,。。。
阳光总会在风雨之后洒向苍茫 -
donlianli:
莫非去淘宝菜鸟网络了?
阳光总会在风雨之后洒向苍茫 -
菜鸟小于:
我也是哈尔滨的,在广州做了三年的开发,可是实际上我们是在维护一 ...
阳光总会在风雨之后洒向苍茫
CXF服务端代码:
1、web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- Spring Config Location --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/beans.xml</param-value> </context-param> <!-- Spring ContextLoaderListener --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- Apache CXFServlet --> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- CXFServlet Mapping --> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> </web-app>
2、beans.xml配置, 在beans.xml中配置服务端的拦截器interceptor.AuthenticationInterceptor,拦截器需要
继承AbstractPhaseInterceptor
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!-- Import Apache CXF Bean Definition --> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- serviceClass指定接口 --> <jaxws:server id="hello" serviceClass="service.SampleWebService" address="/HelloWorld"> <jaxws:serviceBean> <bean class="service.SampleWebService" /> </jaxws:serviceBean> <jaxws:inInterceptors> <bean class="interceptor.AuthenticationInterceptor"> <property name="username" value="admin" /> <property name="password" value="admin" /> </bean> </jaxws:inInterceptors> </jaxws:server> </beans>
3、在拦截器中对用户身份进行验证
package interceptor; import java.util.List; import javax.xml.soap.SOAPException; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Node; public class AuthenticationInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String username; private String password; public AuthenticationInterceptor() { // 指定该拦截器在哪个阶段被激发 super(Phase.PRE_INVOKE); } public void handleMessage(SoapMessage msg) throws Fault { List<Header> headers = msg.getHeaders(); if (null == headers || headers.size() < 1) { throw new Fault(new SOAPException("SOAPHeader格式错误")); } for (Header header : headers) { Node root = (Node) header.getObject(); if("Authentication".equals(root.getNodeName())){ Node userNode = root.getFirstChild(); Node passwordNode = root.getLastChild(); if(userNode == null || passwordNode == null){ throw new Fault(new SOAPException("SOAPHeader需要包含Username和Password节点")); } if(!userNode.getNodeName().equals("Username") || !passwordNode.getNodeName().equals("Password")){ throw new Fault(new SOAPException("SOAPHeader需要包含Username和Password节点")); } if(username.equals(userNode.getTextContent()) && password.equals(passwordNode.getTextContent())){ System.out.println("认证通过"); } else{ throw new Fault(new SOAPException("用户名或密码错误")); } } else{ throw new Fault(new SOAPException("SOAPHeader需要包含Authentication节点")); } } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
4、服务接口,CXF可以直接发布JavaBean,只需要一个@WebService注解
package service; import javax.jws.WebService; @WebService public class SampleWebService{ public String sayHello(String name) { return "Hello, "+name; } public String sayHi(String name) { return "Hi, "+name; } }
5、Axis客户端:
/** * <soapenv:Header> * <Authentication * soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" * soapenv:mustUnderstand="0" * xmlns=""> * <Username>admin</Username> * <Password>admin</Password> * </Authentication> * </soapenv:Header> * @param user * @param password */ public static void authentication(String user, String password){ try { Call call = (Call)new Service().createCall(); call.setTargetEndpointAddress("http://localhost:8080/ws/service/HelloWorld"); String namespace = "";//命名空间 SOAPHeaderElement header = new SOAPHeaderElement(namespace,"Authentication"); header.setPrefix("");//前缀 header.addChildElement("Username").addTextNode(user); header.addChildElement("Password").addTextNode(password); call.addHeader(header); Object obj = call.invoke("sayHi", new String[]{"sam"}); System.out.println(obj); } catch (Exception e) { e.printStackTrace(); } }
在axis的jar包中还提供了一个tcp_moniter,可以用来拦截soap消息,便于debug。
可以使用java -Djava.ext.dirs=lib org.apache.axis.utils.tcpmon来启动,启动前要先将axis的jar包都放在lib目录下,然后在lib的同级目录中建一个bat脚本,脚本中写:java -Djava.ext.dirs=lib org.apache.axis.utils.tcpmon。
这样双击bat脚本就可以启动tcp_moniter了。
tcp_moniter界面:
cxf_server端和axis_client端的工程源码见附件。
- axis_client.rar (1.7 MB)
- 下载次数: 129
- cxf_server.part1.rar (9.5 MB)
- 下载次数: 78
- cxf_server.part2.rar (7.9 MB)
- 下载次数: 62
评论
2 楼
lizhenzhendebishe
2017-08-07
提示An error was discovered processing the <wsse:Security> header
1 楼
CoderDream
2014-09-28
感谢分享,运行通过,:D
Axis客户端的Client.java的第17行需要修改为(项目名称由ws改为cxf_server): call.setTargetEndpointAddress("http://localhost:8080/cxf_server/service/HelloWorld");
Axis客户端的Client.java的第17行需要修改为(项目名称由ws改为cxf_server): call.setTargetEndpointAddress("http://localhost:8080/cxf_server/service/HelloWorld");
发表评论
-
使用zookeeper实现分布式共享锁
2013-04-13 15:59 2607分布式系统中经常需要协调多进程,多个jvm,或者多台机器之间 ... -
使用axis轻松调用Webservice
2012-11-10 13:15 22001使用axis1.4调用webservice有两种简单的方式: ... -
执行java程序时如何引用依赖的jar
2012-11-10 12:38 1793在执行java程序时我们可以通过-Djava.ext.dirs ... -
Log4j简单实用配置
2012-10-27 12:22 3675#A1为控制台输出,A2为文件输出,R为文件输出,并且按 ... -
JavaNIO处理长连接
2012-09-12 21:04 14152之前在IBM的网站上看到过一篇介绍NIO的文章,收获很大。但文 ... -
Int和byte数组之间的转换
2012-08-27 20:25 18824有时候和C的程序通信的时候,我们在封装协议时,可能需要将Jav ... -
用闭锁测试HashMap的并发写入问题
2012-08-27 19:39 3668今天无意中看到以前写 ... -
LDAP查询分页,基于迭代器的查询分页
2012-08-25 17:26 8623LDAP服务器端可以支持分页查询,但是有个前提条件 ... -
并行计算框架的Java实现--系列三
2012-07-14 14:38 4171接上篇并行计算框架的Java实现--系列二 优化锁,之 ... -
并行计算框架的Java实现--系列二
2012-07-14 08:41 2941接上篇并行计算框架的J ... -
并行计算框架的Java实现--系列一
2012-07-14 07:38 3519最近的工作需要统计一些复杂的报表,为了提高效率,想用多线程去实 ... -
ant初探
2012-06-29 13:38 2919前些天和同事交流,他说ant非常好用,他一直在用,学习资料共享 ... -
基于事件的 NIO 多线程服务器
2012-06-27 17:06 1286JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程 ... -
Java NIO学习
2012-06-22 22:46 0端午节加班要开发一个SocketServer,需要承载1000 ... -
httpclient访问https服务,可以信任证书
2012-06-02 00:48 6859private HttpClient initHttpClie ... -
Java或Web工程中查找配置文件
2012-06-02 00:35 1072String path = ""; URL ... -
如何获取真实的终端IP
2011-11-24 11:16 1224在有Apache做负载均衡的时候使用request.getRe ... -
MANIFEST.MF的应用以及如何读取jar包外的log4j.properties
2011-11-22 18:21 34MANIFEST.MF是jar文件的配置文件,在用eclips ... -
java实现的telnet协议
2011-10-02 17:14 7400package telnet; import j ... -
很好用的java反编译工具
2011-10-02 16:36 1252可以反编译单个文件,也可以反编译整个jar
相关推荐
为了能够通过Axis 1.4客户端调用上面部署的WebService,需要对生成的WSDL文件进行一定的修改,使其符合Axis 1.4的要求。 **步骤四:修改WSDL文件** 1. **下载WSDL文件**:通过访问服务的WSDL URL将其保存为`...
本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解发布Web服务的过程: 1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web...
在这个基于CXF的Web服务完整例子中,我们将深入探讨CXF的核心概念、配置、以及如何创建和调用Web服务。 1. **CXF框架介绍**:CXF,全称为"Code first eXtended Framework",最初由XFire项目发展而来,后与Apache ...
本教程将讲解如何使用Spring Boot集成Apache CXF(一个强大的Java Web Service框架)来构建服务端,并探讨两种Java客户端调用Web Service接口的方法。 首先,我们需要理解Spring Boot与CXF的整合。Spring Boot通过...
标签中的"soap axis2 apache java webservice"揭示了这些工具和技术主要用于处理Java环境下的SOAP Web服务。在实际开发中,开发者通常会使用Axis2来创建服务,然后使用CXF来提供更高级的功能,如REST支持和与其他...
在IT行业中,Web服务是...总的来说,创建和调用WebService涉及到服务接口定义、服务实现、WSDL生成、客户端代码生成以及请求和响应的处理等多个环节。了解这些步骤有助于你在实际工作中高效地实现跨系统的数据交换。
为了在CXF客户端中使用这个适配器,我们需要在服务接口的方法签名中使用`@XmlJavaTypeAdapter`注解,将适配器类与Map参数关联起来,这样CXF在处理数据时就会自动调用适配器进行转换。 在服务实现类中,`@WebService...
在客户端调用WebService时,这个库用于解析服务的WSDL文件,从而生成相应的代理类,使得客户端代码能够方便地调用服务。 3. **axis-jaxrpc-1.4.jar**:这个jar包是Apache Axis的一部分,它实现了JAX-RPC(Java API ...
你需要在Tomcat中部署WebService服务,然后使用Axis工具生成客户端代码,最后在客户端应用程序中运行这段代码来调用服务。 总的来说,理解WebService的基本原理,熟悉Java中的相关工具,以及正确配置和使用这些工具...
本文将详细介绍四种常见的 WebService 发布方式及其客户端调用方法,包括 CXF、XFire、AXIS1 和 AXIS2,并结合实际案例进行分析。 #### 二、CXF 方式 **1. 概述** - CXF 是 Apache 的一款开源框架,它提供了强大...
Axis2是Apache软件基金会开发的一个Web服务框架,它提供了动态调用Web服务的能力。本文将深入探讨如何使用Axis2来动态地调用Web Service,并通过分析`WebServiceInvoker.java`这个文件来理解其实现原理。 1. **Java...
本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...
使用Axis调用WebService时,你需要先下载Axis的二进制包,然后通过WSDL(Web服务描述语言)文件生成客户端存根类。这些存根类提供了与服务交互的方法,使得开发者可以像调用本地方法一样调用远程服务。 2. CXF:...
5. **测试服务**:创建一个Web服务客户端,调用服务接口进行测试。可以使用CXF或Axis2提供的客户端工具,或者编写自己的Java代码。 6. **运行实例**:运行客户端,你应该能在控制台看到服务返回的“Hello, name”...
3. "java 调用webservice的各种方法总结 - 比较详细且简单的.mht":这个文件应该汇总了多种Java调用Web服务的方法,比如使用JAX-WS、Apache CXF或Axis2等库,可能包括代码示例和优缺点分析。 4. "java调用...
- **WSDL到Java**:从服务端获取WSDL文件,使用CXF或Axis提供的工具将其转换为Java客户端代码,然后在自己的应用中引入这些生成的类来调用服务。 - **动态代理**:对于CXF,可以通过JAX-WS API动态生成客户端代理...
- 客户端调用:使用AXIS客户端工具或者自定义代码调用服务。 【xfire篇】 XFire是另一个开源的SOAP和RESTful Web Services框架,后来被集成到了CXF项目中。XFire以其轻量级和高性能著称,它简化了服务的开发和调用...
在Java中,我们需要这个文件来生成客户端代理类,这通常是通过工具如Apache CXF、 Axis2或JAX-WS的wsimport命令完成的。例如,我们可以使用`wsimport -keep -s src -d bin http://example.com/MyWebService?wsdl`...