cxf+web service(二)代理工厂,安全验证,数据绑定

标签: cxf web service | 发表时间:2014-05-06 11:09 | 作者:
出处:http://www.iteye.com

(二)代理工厂,安全验证,数据绑定

 

代理工厂

1.服务端:ServerFactoryBean,JaxWsServerFactoryBean 用于服务端调用.前者针对POJO,后者针对JAX-WS,他们用于生成服务端的EndPoint,暴露出服务接口

2.客户端:ClientProxyFactoryBean,JaxWsProxyFactoryBean 用于客户端调用.前者针对POJO,后者针对JAX-WS,他用于在客户端生成Web Service的代理proxy

3.除了这些Factory,CXF客户端还有ClientFactoryBean,JaxWsClientFactoryBean,这两个Factory生成的不是Web Service的代理,而是一个Endpoint,提供一些更该机的功能.

 

安全验证

Apache WSS4J(WebService Security For Java) 实现了java语言的 WS-Security.WSS4J依赖于SAAJ.CXF中使用拦截器机制完成WSS4J功能的支持.只需要初始化WSS4JInInterceptor(对应还有一个WSS4JOutInterceptor)实例并添加相关信息即可.CXF2.1.x之后的版本可以完成SAAJInInterceptor(对应的一个SAAJOutInterceptor)拦截器的自动注册,否则需要再注册一下SAAJ拦截器.

1.在spring.xml中配置WSS4J输入拦截器

 

<bean id="wss4jInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
   <map>
      <entry key="xx" value="xx"/>
   </map>
</bean>

在接口服务里面加入关系

<jaxws:inInterceptors>
	<ref bean="wss4jInInterceptor" />
</jaxws:inInterceptors>

下面是服务器端具体密码回调处理类,它负责接收并处理客户端提交的用户名和密码,这个方法没有返回值,显示,如果验证失败,抛出异常表示.

import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.WSSecurityException;

public class ServerPasswordCallbackHandler implements CallbackHandler {

	public final static String USER = "liu";
	public final static String PASSWORD = "lius";//设置用户名密码
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		WSPasswordCallback wspassCallback = (WSPasswordCallback) callbacks[0];
		System.out.println(wspassCallback.getIdentifier() + "\t"
				+ wspassCallback.getPassword());
		
		if(WSConstants.PASSWORD_TEXT.equals(wspassCallback.getPasswordType())){
			if (wspassCallback.getIdentifier().equals(USER)
					&& wspassCallback.getPassword().equals(PASSWORD)) {
				System.out.println(".................验证通过!");   
				System.out.println(".................identifier = " + USER);   
				System.out.println(".................password = " + PASSWORD); 
			} else {
				throw new WSSecurityException("............未通过验证!");
			}
		} else {
			//密码使用MD5密文发送
			System.out.println(wspassCallback.getIdentifier()); 
			wspassCallback.setPassword(PASSWORD);
		}
	}
}

2.客户端实现:在spring.xml中配置WSS4J输出拦截器

<bean id="wss4jOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
   <map>
      <entry key="xx" value="xx"/>
   </map>
</bean>

在服务接口里加入关系

<jaxws:outInterceptors>
	<ref bean="wss4jOutInterceptor" />
</jaxws:outInterceptors

这里使用了WSS4J输出拦截器,因为要将用户名和密码输出到服务器进行验证处理.另外与服务端不同的是多了一个user参数初始化WSS4J的输出拦截器,用于初始化用户名,这是一个必选,稍后将在下面的客户端密码回调处理类进行重新设定值

import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.ws.security.WSPasswordCallback;

public class ClientPasswordCallbackHandler implements CallbackHandler{
	public final static String USER = "liu";
	public final static String PASSWORD = "lius";//设置用户名密码
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		WSPasswordCallback wspassCallback = (WSPasswordCallback)callbacks[0];
		wspassCallback.setIdentifier(USER);
		wspassCallback.setPassword(PASSWORD);
	}
}

然后我们访问这个web服务,从控制台查看日志,可以看到在SOAP信封的Header中包装了<wsse:Security...等元素,元素包括了WS-Security 的一些信息和设置的用户名和密码.如果使用MD5加密,则密码显示为null,只能显示用户名.如果客户端和服务端的用户名或者密码不对应,则登陆不上,会显示"...为通过验证!".

 

数据绑定

 

1.JAXB绑定.JAXB是一套自动映射XML和JAVA 实例的开发接口和工具.如果Web Service发布的接口的参数类型时类,而且返回的类型是List,String等,这样发布的Web Service 与普通的java没区别,因为JAXB都支持.但是JAXB不能将一些java类型自然映射到XML表现形式,例如HashMap,或其他非JavaBean之类,例如接口,Map,这样就要定义一个适配器,使java类型自动适应.一般可以编写一个类继承XmlAdapter,以实现此抽象类的适配器,另外可以安装使用注释XmlJavaTypeAdapter的适配器

 

2.Aegis Databingding.Aegis是一个快速,基于STAX的数据绑定,他能使采用代码优先方式发布Web Service的情况更简单.Aegis支持接口,集合类,MAP和各种数据类型.也不需要注释,也不需要写适配器

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [cxf web service] 推荐:

cxf+web service(二)代理工厂,安全验证,数据绑定

- - ITeye博客
(二)代理工厂,安全验证,数据绑定. 1.服务端:ServerFactoryBean,JaxWsServerFactoryBean 用于服务端调用.前者针对POJO,后者针对JAX-WS,他们用于生成服务端的EndPoint,暴露出服务接口. 2.客户端:ClientProxyFactoryBean,JaxWsProxyFactoryBean 用于客户端调用.前者针对POJO,后者针对JAX-WS,他用于在客户端生成Web Service的代理proxy.

Web Service入门

- - 博客 - 伯乐在线
本文来自文章作者 @Jeremy黄国华 的投稿. 伯乐在线也欢迎其他朋友投稿,投稿时记得留下您的新浪微博账号哦~. 目前对Web Service没有统一的定义,定义一:Web Service是自包含的、模块化的应用程序,它可以在Web中被描述、发布、查找以及调用. 定义二:Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼任的组件进行操作.

Web Service的研究

- - CSDN博客系统运维推荐文章
SOA和Web Service. 首先明白SOA和Web Service的关系:. * SOA面向服务架构,用于大型分布式系统的一个概念;. * Web Service是实现SOA的方式之一,不是所有的SOA都是基于Web service的;. * 但Webservice确实为最主流的SOA实现方式,有的人甚至把SOA等同于Webservice.

Restful 和 Jersey介绍(Web Service )

- - CSDN博客架构设计推荐文章
REST 2000 年由 Roy Fielding 在博士论文中提出,他是 HTTP 规范 1.0 和 1.1 版的首席作者之一. REST 中最重要的概念是资源(resources) ,使用全球 ID(通常使用 URI)标识. 客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE )操作资源或资源集.

论Web Service 相关技术(转)

- - 互联网 - ITeye博客
摘要:随着Internet和weh技术的迅速发展,传统的分布式计算技术已经不能 很好的适用于Web环境. 正是基于这种情况,Web Service技术应运而生. Web Service是一个新概念,它的系统架构、实现技术是现有应用的面向Internet的一个延伸. Web是为了程序到用户的交互,而Web Service是为程序到程序的交互作准备,web Service已成为IT产业近几年来探索的热点课题之一.

基于web的cxf的第一种发布方式——简单发布

- - CSDN博客编程语言推荐文章
前面所介绍的cxf发布方式都只给予javase的,以下是基于web的cxf的发布方式的第一种——简单发布.       新建一个webproject,然后导入cxf的基本jar包(共67个).     在web.xml中加上以下代码.      . .

浅谈Soap/Web Service架构及其应用(转)

- - 互联网 - ITeye博客
       概述:随着计算机网络时代的到来,Internet/Intranet无可避免的成为现代商业信息化发展的必要趋势,而基于原有的局域网及企业内部网络的 二层式甚至是单机式的信息服务结构已经不能满足现代商业社会的需要,分布式应用技术自然而然成了主流的开发技术. 本课程设计主要讨论Soap/Web Service架构方式、原理及其在分布式开发中的应用技术.

分布式通信的几种方式(EJB、RMI、RPC、JMS、web service杂谈)

- - CSDN博客互联网推荐文章
RPC是远程过程调用协议,它是基于C/S模型调用的机制,客户机向服务器端发送调用请求等待服务器应答,是一种典型的请求应答机制,大致过程可以理解为本地分布式对象向本机发请求,不用自己编写底层通信本机会通过网络向服务器发送请求,服务器对象接受参数后,经过处理再把处理后的结果发送回客户端. 它是早期的支持分布式一些,缺点rpc是面向过程的远程调用,不支持面向对象,所以现在用的人就少了.

SPRING BOOT OAUTH2 + KEYCLOAK - service to service call

- - BlogJava-首页技术区
employee-service调用department-service,如果要按OAUTH2.0流程,只需要提供client-id和client-secrect即可. 在KEYCLOAK中引入service-account,即配置该employee-service时,取消standard-flow,同时激活service-account.

Android Service 详解

- - CSDN博客移动开发推荐文章
一个Service也是一种应用程序组件,它运行在后台以提供某种服务,通常不具有可见的用户界面. 其它的应用程序组件可以启动一个Service,即使在用户切换到另外一个应用程序后,这个Service还是一直会在后台运行. 此外,一个应用程序也可以绑定到一个Service然后使用进程间通信(IPC)方式与Service之间发生交互.