`
log_cd
  • 浏览: 1098426 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SpringBoot开发WebService之CXF

阅读更多
一、在服务器端的WebSerivce服务发布
1、POM.xml文件引入相关的依赖包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>net.logcd</groupId>
	<artifactId>springboot_wscxf</artifactId>
	<version>1.0.0</version>
	<packaging>jar</packaging>

	<name>springboot_wscxf</name>
	<description></description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.8.RELEASE</version>
		<relativePath/>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.7</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web-services</artifactId>
		</dependency>
		
		<dependency>
		    <groupId>org.apache.cxf</groupId>
		    <artifactId>cxf-rt-frontend-jaxws</artifactId>
		    <version>3.1.6</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.cxf</groupId>
		    <artifactId>cxf-rt-transports-http</artifactId>
		    <version>3.1.6</version>
		</dependency>
        
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

2、定义服务
@WebService(targetNamespace="http://cxf.logcd.net")
@Service("helloService")
public class HelloService{

    public String sayHello(String user, String userData) {
        return "hello," + user+"! userData = "+userData;
    }

}

3、定义访问权限验证的拦截器
/**
 * 校验(用户名、密码)拦截器
 */
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	private Logger logger = Logger.getLogger(this.getClass());
	private static final String USERNAME = "admin";
	private static final String PASSWORD = "admin";

	public AuthInterceptor() {
		// 定义在哪个阶段进行拦截
		super(Phase.PRE_PROTOCOL);
	}

	@Override
	public void handleMessage(SoapMessage soapMessage) throws Fault {
		List<Header> headers = null;
		String username = null;
		String password = null;
		try {
			headers = soapMessage.getHeaders();
		} catch (Exception e) {
			logger.error("getSOAPHeader error: {}", e);
		}

		if (headers == null) {
			throw new Fault(new IllegalArgumentException("找不到Header,无法验证用户信息"));
		}
		// 获取用户名,密码
		for (Header header : headers) {
			SoapHeader soapHeader = (SoapHeader) header;
			Element e = (Element) soapHeader.getObject();
			NodeList usernameNode = e.getElementsByTagName("username");
			NodeList pwdNode = e.getElementsByTagName("password");
			username = usernameNode.item(0).getTextContent();
			password = pwdNode.item(0).getTextContent();
			if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
				throw new Fault(new IllegalArgumentException("用户信息为空"));
			}
		}
		// 校验用户名密码
		if (!(username.equals(USERNAME) && password.equals(PASSWORD))) {
			SOAPException soapExc = new SOAPException("认证失败");
			logger.info("用户认证信息错误");
			throw new Fault(soapExc);
		}
	}

}

4、发布webserive服务
/**
 * 配置并发布WebService
 */
@Configuration
public class WSCxfConfig {
	
	@Bean
	public ServletRegistrationBean dispatcherServlet() {
		//接口访问的过滤路径
		return new ServletRegistrationBean(new CXFServlet(), "/cxf/*");
	}

	@Bean(name = Bus.DEFAULT_BUS_ID)
	public SpringBus springBus() {
		return new SpringBus();
	}

	@Bean
	public HelloService helloService() {
		return new HelloService();
	}

	@Bean
	public Endpoint endpoint() {
		EndpointImpl endpoint = new EndpointImpl(springBus(), helloService());
		endpoint.getInInterceptors().add(new AuthInterceptor());//添加校验拦截器
		endpoint.publish("/helloService");
		return endpoint;
	}

}

5、SpringBoot应用启动
@SpringBootApplication
public class Application {
	
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
	
}

二、客户端测试调用WebService
1、调用WebSerivce时,设置帐号密码的拦截器
/**
 * 调用时添加用户名密码信息
 */
public class LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	private String namespace = "http://cxf.cdmcs.com";
	private String username = "admin";
	private String password = "admin";

	public LoginInterceptor(String username, String password) {
		// 设置在发送请求前阶段进行拦截
		super(Phase.PREPARE_SEND);
		this.username = username;
		this.password = password;
	}

	@Override
	public void handleMessage(SoapMessage soapMessage) throws Fault {
		List<Header> headers = soapMessage.getHeaders();
		Document doc = DOMUtils.createDocument();
		Element auth = doc.createElementNS(namespace, "SecurityHeader");
		Element UserName = doc.createElement("username");
		Element UserPass = doc.createElement("password");

		UserName.setTextContent(username);
		UserPass.setTextContent(password);

		auth.appendChild(UserName);
		auth.appendChild(UserPass);

		headers.add(0, new Header(new QName("SecurityHeader"), auth));
	}

}

2、客户端调用测试
public class TestClientCXFWS {

	/**
	 * 动态调用方式
	 * @throws Exception
	 */
	@Test
	public void invokeHelloService_WS() throws Exception {
		//WSDL路径 
        String wsUrl = "http://127.0.0.1:8080/cxf/helloService?wsdl";
        String nameSpace = "http://cxf.logcd.net";
		//方法名 
		String method = "sayHello"; 
		
		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient(wsUrl);
        //需要密码的情况需要加上用户名和密码
        client.getOutInterceptors().add(new LoginInterceptor("admin","admin"));
        Endpoint endpoint = client.getEndpoint();
        
        //endpoint.getService().getName().getNamespaceURI()
        QName opName = new QName(nameSpace, method);
        BindingInfo bindingInfo = endpoint.getEndpointInfo().getBinding();
        
        //如果命名空间不对,需要重新寻找operationName
        if (bindingInfo.getOperation(opName) == null) {
            for (BindingOperationInfo operationInfo : bindingInfo.getOperations()) {
              if (method.equals(operationInfo.getName().getLocalPart())) {
                opName = operationInfo.getName();
                break;
              }
            }
        }
        
        Object[] params = new Object[] {"Lucy","{time:"+new Date().toString()+"}"};
        Object[] retArr = client.invoke(opName, params);
        System.out.println(retArr[0]);
	}
	
}
分享到:
评论

相关推荐

    SpringBoot开发WebService之CXF示例

    在本文中,我们将深入探讨如何使用SpringBoot集成Apache CXF来开发Web服务。SpringBoot以其简洁的配置和快速的应用启动而受到广大开发者的欢迎,而CXF是一个强大的开源框架,用于构建和消费Web服务。结合这两者,...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验 本实验的主要目标是使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验。下面是实验的详细介绍: 标题...

    springboot整合webservice采用CXF技术

    在IT行业中,Spring Boot是一个备受推崇的框架,它简化了Spring应用的开发过程,而Web服务(WebService)则是一种常见的应用程序接口(API)交互方式。本文将深入探讨如何使用Apache CXF库在Spring Boot项目中集成和...

    springboot整合CXF发布webservice和客户端调用

    SpringBoot整合CXF是将流行的Java Web服务框架CXF与SpringBoot轻量级框架结合,以便更方便地创建和消费Web服务。这个项目提供了一个很好的示例,通过详细注释帮助开发者理解如何在SpringBoot应用中发布和调用Web服务...

    springboot+webservice+cxf

    SpringBoot与CXF整合创建Web服务 在现代的软件开发中,Web服务是实现系统间交互的重要手段。SpringBoot以其轻量级、快速启动和易于配置的特点,成为了开发微服务的首选框架。而Apache CXF则是一个强大的开源框架,...

    SpringBoot WebService cxf接口发布以及logbok日志集成

    在IT行业中,SpringBoot、WebService和cxf是三个非常重要的技术组件,它们分别代表了现代Java应用程序开发的基础、服务间通信的重要方式以及一种强大的服务框架。在这个主题中,我们将深入探讨如何在SpringBoot项目...

    springBoot完整整合WebService框架CXF示例

    CXF是一个开源的Java框架,用于构建和开发服务导向架构(SOA)应用程序,它支持SOAP和RESTful服务。SpringBoot则简化了Spring应用的初始化和配置,使得创建独立的、生产级别的基于Spring的应用变得容易。 本示例...

    springboot+webservice搭建webservice服务端

    在IT行业中,Web Service是一种基于XML的通信标准,允许不同系统之间进行互操作性交互。...在实际开发中,可以根据项目需求选择适合的客户端调用方式,同时注意处理异常和错误,确保服务的稳定性和可靠性。

    SpringBoot框架及CXF发布WebService

    在给定的压缩包文件中,"WebService_Server"可能包含了SpringBoot与CXF集成的服务器端代码示例,而"Webservice_Client"则可能包含CXF客户端调用服务的示例代码。这两个部分可以作为学习和实践SpringBoot发布和消费...

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

    在实际开发中,选择哪种方式取决于项目需求和个人偏好。 总结,本教程详细介绍了如何利用Spring Boot和Apache CXF搭建Web Service服务端,以及使用JAX-WS的`javax.xml.ws.Service`和Apache CXF的`...

    springboot+CXF发布webservice接口

    而CXF则是一个开源服务框架,它支持多种Web服务标准,如SOAP和RESTful API,使得开发和部署Web服务变得简单。本教程将详细介绍如何在Spring Boot项目中集成CXF来发布Web服务接口。 首先,我们需要确保项目中包含了...

    springboot-cxf-webservice

    SpringBoot与CXF WebService整合教程 在Java世界中,SpringBoot以其简洁的配置和快速的应用开发能力,已经成为主流的微服务框架。而CXF作为一款强大的SOAP和RESTful Web服务框架,使得开发者能够轻松地创建和消费...

    spring+CXF实现WebService(http+https)

    Spring框架是Java企业级应用开发的首选,而CXF是一个强大的开源服务框架,支持创建和消费Web服务。本教程将深入探讨如何利用Spring和CXF来实现基于HTTP和HTTPS的Web服务,并且将涉及到HTTPS的证书配置。 1. **...

    WebServiceConfig java springboot利用Apache CXF创建webserice接口配置类

    webserviceApache CXF java springboot利用Apache CXF创建webserice接口 Apache CXF 核心架构是以BUS为核心,整合其他组件。 * Bus是CXF的主干, 为共享资源提供一个可配置的场所,作用类似于Spring的...

    springboot2.1.5集成CXF3.2.5,webservice服务端

    在IT行业中,Spring Boot和Apache CXF是两个非常重要的组件,它们在开发高效、轻量级的Web服务中发挥着关键作用。本文将详细介绍如何在Spring Boot 2.1.5版本中集成CXF 3.2.5,以创建一个功能完备的Web Service...

    SpringBoot+mybatis+CXF开发web service接口.rar

    在本项目中,我们主要探讨如何使用SpringBoot、MyBatis和CXF框架来开发Web Service接口,并且数据库选用MySQL。这是一个完整的后端服务开发流程,涵盖了从数据存储到服务暴露的所有关键步骤。 首先,SpringBoot是...

    SpringBoot集成webService

    在IT行业中,SpringBoot是一个非常流行的Java开发框架,它简化了Spring应用的初始搭建以及开发过程,提供了大量的自动配置选项,使得开发者可以快速构建出健壮的Web应用。而Web服务,尤其是基于SOAP协议的Web ...

    源码-springboot+cxf实现webservice服务端

    在Java领域中,Apache CXF因其强大的功能和广泛的兼容性成为了构建WebService的首选框架之一。本文将通过具体的源码示例,详细介绍如何在Spring Boot环境中使用CXF来搭建一个简单的WebService服务端。 #### 二、...

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    本文将详细介绍如何为CXF与Spring整合发布WebService添加拦截器进行权限控制。 首先,我们需要理解CXF拦截器的概念。拦截器是CXF提供的一种机制,它允许我们在Web服务调用的生命周期中的不同阶段插入自定义逻辑,如...

    【webservice】Springboot整合CXF包括源码

    在IT行业中,Spring Boot和Apache CXF是两个非常重要的开源框架,它们分别用于简化Spring应用的开发和构建Web服务。本文将深入探讨如何整合Spring Boot与CXF,以便利用Spring Boot的便捷性和CXF的强大Web服务功能。...

Global site tag (gtag.js) - Google Analytics