`
378629846
  • 浏览: 216031 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

WebService:Axis客户端调用需要身份验证的CXF服务

 
阅读更多

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端的工程源码见附件。

 

分享到:
评论
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");

相关推荐

    webservice :spring 3+cxf3.4服务方,AXIS1.4请示方调用

    为了能够通过Axis 1.4客户端调用上面部署的WebService,需要对生成的WSDL文件进行一定的修改,使其符合Axis 1.4的要求。 **步骤四:修改WSDL文件** 1. **下载WSDL文件**:通过访问服务的WSDL URL将其保存为`...

    axis2发布webservice和调用axis2服务接口

    本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解发布Web服务的过程: 1. **创建WebService**:在Axis2中,可以通过编写一个简单的Java类并暴露其方法作为Web...

    webService(基于cxf)的完整例子

    在这个基于CXF的Web服务完整例子中,我们将深入探讨CXF的核心概念、配置、以及如何创建和调用Web服务。 1. **CXF框架介绍**:CXF,全称为"Code first eXtended Framework",最初由XFire项目发展而来,后与Apache ...

    springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

    本教程将讲解如何使用Spring Boot集成Apache CXF(一个强大的Java Web Service框架)来构建服务端,并探讨两种Java客户端调用Web Service接口的方法。 首先,我们需要理解Spring Boot与CXF的整合。Spring Boot通过...

    axis2-1.8.0apache-cxf-3.4.4.rar

    标签中的"soap axis2 apache java webservice"揭示了这些工具和技术主要用于处理Java环境下的SOAP Web服务。在实际开发中,开发者通常会使用Axis2来创建服务,然后使用CXF来提供更高级的功能,如REST支持和与其他...

    四步完成WebService服务端与客户端的调用

    在IT行业中,Web服务是...总的来说,创建和调用WebService涉及到服务接口定义、服务实现、WSDL生成、客户端代码生成以及请求和响应的处理等多个环节。了解这些步骤有助于你在实际工作中高效地实现跨系统的数据交换。

    cxf_axis_xfire客户端调用的几种方法[收集].pdf

    为了在CXF客户端中使用这个适配器,我们需要在服务接口的方法签名中使用`@XmlJavaTypeAdapter`注解,将适配器类与Map参数关联起来,这样CXF在处理数据时就会自动调用适配器进行转换。 在服务实现类中,`@WebService...

    客户端调用webservice所需完整jar包

    在客户端调用WebService时,这个库用于解析服务的WSDL文件,从而生成相应的代理类,使得客户端代码能够方便地调用服务。 3. **axis-jaxrpc-1.4.jar**:这个jar包是Apache Axis的一部分,它实现了JAX-RPC(Java API ...

    webservice在java中客户端调用

    你需要在Tomcat中部署WebService服务,然后使用Axis工具生成客户端代码,最后在客户端应用程序中运行这段代码来调用服务。 总的来说,理解WebService的基本原理,熟悉Java中的相关工具,以及正确配置和使用这些工具...

    webservice四种发布方式及客户端调用

    本文将详细介绍四种常见的 WebService 发布方式及其客户端调用方法,包括 CXF、XFire、AXIS1 和 AXIS2,并结合实际案例进行分析。 #### 二、CXF 方式 **1. 概述** - CXF 是 Apache 的一款开源框架,它提供了强大...

    Java动态调用webService,axis2动态调用webService

    Axis2是Apache软件基金会开发的一个Web服务框架,它提供了动态调用Web服务的能力。本文将深入探讨如何使用Axis2来动态地调用Web Service,并通过分析`WebServiceInvoker.java`这个文件来理解其实现原理。 1. **Java...

    纯java调用ws-security+CXF实现的webservice安全接口

    本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...

    WebService调用的几种方式

    使用Axis调用WebService时,你需要先下载Axis的二进制包,然后通过WSDL(Web服务描述语言)文件生成客户端存根类。这些存根类提供了与服务交互的方法,使得开发者可以像调用本地方法一样调用远程服务。 2. CXF:...

    webservice axis2 cxf jar包及简单实例

    5. **测试服务**:创建一个Web服务客户端,调用服务接口进行测试。可以使用CXF或Axis2提供的客户端工具,或者编写自己的Java代码。 6. **运行实例**:运行客户端,你应该能在控制台看到服务返回的“Hello, name”...

    Axis2教程和java调用webservice的各种方法总结

    3. "java 调用webservice的各种方法总结 - 比较详细且简单的.mht":这个文件应该汇总了多种Java调用Web服务的方法,比如使用JAX-WS、Apache CXF或Axis2等库,可能包括代码示例和优缺点分析。 4. "java调用...

    WebService Axis和XFire(CXF)的开发流程

    - **WSDL到Java**:从服务端获取WSDL文件,使用CXF或Axis提供的工具将其转换为Java客户端代码,然后在自己的应用中引入这些生成的类来调用服务。 - **动态代理**:对于CXF,可以通过JAX-WS API动态生成客户端代理...

    WebService详细解析(axis,xfire,cxf,授权认证加密解密)

    - 客户端调用:使用AXIS客户端工具或者自定义代码调用服务。 【xfire篇】 XFire是另一个开源的SOAP和RESTful Web Services框架,后来被集成到了CXF项目中。XFire以其轻量级和高性能著称,它简化了服务的开发和调用...

    客户端编程方式调用webservice

    在Java中,我们需要这个文件来生成客户端代理类,这通常是通过工具如Apache CXF、 Axis2或JAX-WS的wsimport命令完成的。例如,我们可以使用`wsimport -keep -s src -d bin http://example.com/MyWebService?wsdl`...

Global site tag (gtag.js) - Google Analytics