基于 spring + apache cxf
1.服务器端 cxf配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="greetingService"
implementor="com.test.service.impl.GreetingServiceImpl"
address="/greetingService" >
<jaxws:inInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingInInterceptor" />
<bean
class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />
<bean
class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType"
value="PasswordText" />
<entry key="user" value="cxfUser" />
<entry key="passwordCallbackRef">
<ref bean="serverPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
</jaxws:inInterceptors>
</jaxws:endpoint>
<bean id="serverPasswordCallback"
class="com.common.cxf.ServerPasswordCallback" />
</beans>
说明:
action:UsernameToken指使用用户令牌
passwordType:PasswordText指密码加密策略,这里直接文本
user:cxfServer指别名
passwordCallBackRef:serverPasswordCallback指消息验证
2.服务器端 CallbackHandler 拦截处理
package com.core.common.cxf;
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.wss4j.common.ext.WSPasswordCallback;
public class ServerPasswordCallback implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
String pw = pc.getPassword();
String idf = pc.getIdentifier();
System.out.println("password:"+pw);
System.out.println("identifier:"+idf);
if (idf.equals("admin")) {
pc.setPassword("josen");
} else {
throw new SecurityException("验证失败");
}
}
}
说明:
WSPasswordCallback 的passwordType属性和password 属性都为null,你只能获得用户名(identifier),一般这里的逻辑是使用这个用户名到数据库中查询其密码,然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
根据上面说的,我获取的password 为null,所以这里就不用自己判断密码了,只要验证用户名后,在设置密码就可以自动验证了
3.客户端配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<jaxws:client id="greetingService" serviceClass="com.test.service.GreetingService"
address="http://localhost:8080/test/greetingService">
<jaxws:outInterceptors>
<bean
class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
<bean
class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
<bean
class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="passwordType"
value="PasswordText" />
<entry key="user" value="cxfUser" />
<entry key="passwordCallbackRef">
<ref bean="clientPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
</jaxws:outInterceptors>
</jaxws:client>
<bean id="clientPasswordCallback"
class="com.common.cxf.ClientPasswordCallback" />
</beans>
4.客户端CallbackHandler
package com.common.cxf;
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.wss4j.common.ext.WSPasswordCallback;
public class ClientPasswordCallback implements CallbackHandler {
public void handle(Callback[] callbacks) throws IOException,
UnsupportedCallbackException {
for(int i=0;i<callbacks.length;i++)
{
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
pc.setPassword("josen");
pc.setIdentifier("admin");
}
}
}
说明:
只要两边的 Identifier,Password 相同就ok了
相关推荐
使用jdk1.6、cxf2.3和tomcat开发的一个关于验证码的webservice接口,主要实现对手机验证码的验证。
标题“使用CXF的Web服务安全验证”提示我们关注的重点是通过CXF实现Web服务的安全配置。CXF提供了多种方式来实现这一目标,例如使用Spring配置文件或Java代码来设置安全策略。 1. **基本认证**:这是最简单的身份...
本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...
在Spring配置文件中,可以通过`<jaxws:endpoint>`标签来声明一个CXF Web服务,指定服务接口、实现类以及服务地址。 3. **HTTPS支持**: HTTPS是一种安全的通信协议,它在HTTP基础上增加了SSL/TLS层,用于加密传输...
**CXF WebService接口基础** 1. **服务提供者接口(SPI)**:CXF使用JAX-WS(Java API for XML Web Services)服务提供者接口来创建Web服务。开发者可以通过实现`javax.jws.WebService`注解的类来定义服务端点。 2...
【标题】:“cxf做的webservice对外提供接口调用” 【描述】中提到的“webservice对外发布接口全部源码拿起来就能用”,这表明这是一个关于使用Apache CXF框架创建和发布的Web服务项目。Apache CXF是一个开源的Java...
- 使用CXF的WS-Security功能,可以实现安全验证,如OAuth、基本认证等。 - 利用CXF的测试工具,如CXFTestSupport,可以方便地进行服务端和客户端的集成测试。 - 使用Postman等工具,可以模拟客户端对服务端的HTTP...
这可能是整个项目的根目录,里面可能包含了配置文件(如Spring的配置XML、CXF的wsdl或xsd文件)、MyBatis的Mapper接口和XML配置、实体类、服务接口和服务实现类、以及可能的测试代码。这些文件将详细展示如何在实际...
总结来说,基于CXF的Web服务示例提供了一个完整的流程,从创建服务接口、实现服务逻辑、配置服务到测试服务,涵盖了Web服务开发的各个方面。通过学习这个例子,开发者可以掌握CXF的基本使用方法,进一步拓展到更复杂...
根据提供的博文链接,我们可能无法直接获取具体细节,但可以推测讨论的内容可能涉及到以下方面:通过CXF Webservice接口设计一个能够接收并合并分块文件的系统。这个系统可能涉及到客户端将大文件分割成多个小块,...
本示例工程是基于CXF框架构建的一个Webservice应用,该应用集成了Spring框架,以实现更高效的服务管理和依赖注入。CXF是一个开源的Web服务框架,它允许开发者创建和部署SOAP和RESTful服务,同时也支持WS-*标准,如...
例如,你可以配置CXF来实现基于证书的身份验证、消息加密和签名,以增强Web服务的安全性。对于性能,CXF允许你调整缓存策略、启用HTTP连接池等,以提高服务响应速度。 总的来说,CXF是一个强大的工具,它简化了Java...
总的来说,通过CXF框架实现MTOM,开发者可以提高Web服务中大文件传输的效率,降低网络负载,同时需要关注安全性、性能优化和测试环节,确保服务稳定可靠。了解并熟练掌握MTOM在CXF中的应用,对于提升Web服务的质量和...
接着,实现这个接口,提供具体的服务逻辑: ```java @Service public class UserServiceImpl implements UserService { @Override public User getUserInfo(String username, String password) { // 这里添加...
Apache CXF和Spring提供了丰富的扩展点,可以集成如Spring Security来控制访问权限,使用Spring AOP来处理事务,以及通过CXF的拦截器机制来实现自定义的日志、验证等功能。 总结来说,Apache CXF 2与Spring 2.5的...
在本文中,我们将深入探讨如何使用Apache CXF V3.2.4实现带有安全认证的Web服务调用。Apache CXF是一个开源框架,它允许开发者创建和消费各种Web服务,包括SOAP和RESTful API。CXF 3.2版本引入了许多增强功能,包括...
“testWebService”可能是一个测试类或者测试工程,用于验证CXF Web服务的正确性和功能。 总结,Apache CXF 提供了一个强大且灵活的平台来实现Web服务,无论是服务端的构建还是客户端的调用,都提供了便捷的方法。...
通常,这样的教程会包括设置开发环境、创建服务接口、实现服务类、配置CXF以及运行和测试服务的步骤。此外,可能会涉及WSDL(Web服务描述语言)的概念,它是定义Web服务接口的标准语言。 【标签】"源码"和"工具...
### CXF 开发 WebService 服务端详解 #### 一、引言 随着企业级应用对服务化的不断追求,Web Service 成为了实现不同系统间通信的重要手段之一。Apache CXF 是一个高性能、易于使用的框架,它支持多种协议,如SOAP...
【Spring-CXF WebService】是基于Spring框架和Apache CXF实现的一个Web服务示例,它展示了如何在Spring环境中集成CXF来创建、部署和消费Web服务。Spring-CXF结合了Spring的强大功能和CXF的优秀Web服务支持,使得开发...