webservice是一种规范,好比数据库的定义也是一种规范,基于这种规范诞生了很多的数据库,如:mysql、oracle等,现在市面流行的webservice的实现有很多,但我觉得cxf是比较适合于spring结合使用的。使用cxf向外提供webservice接口,势必会有安全问题,使用ws-security可以很好的解决安全问题。下面我们来看例子(采用maven构建项目):
1、项目目录结构
说明: pom.xml--maven构建项目所用到的jar及其他jetty的配置; web.xml--配置spring监听器和cxf过滤器; beans.xml--spring的配置; cxf-beans.xml--cxf服务器端的配置; cxfClient-beans.xml--cxf客户端的配置; log4j.properties--日志文件; Helloworld--webservice接口的定义; HelloworldImpl--webservice接口的实现; ServerPasswordCallback--服务器端安全校验; ClientPasswordCallback--客户端安全校验; WebServiceTest--junit单元测试
2、web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_id" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml;classpath:cxf-beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <description>Apache CXF Endpoint</description> <display-name>cxf</display-name> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/ws/*</url-pattern><!-- 拦截所有以ws开头的地址 --> </servlet-mapping> </web-app>
3、接口的定义及实现
(1)、Helloworld
package com.luoshengsha.ws;import javax.jws.WebService; /** * webservice接口 * @author luoshengsha * 时间:2014-1-5 上午10:41:09 */ @WebService public interface Helloworld { public void say(String name); }
(2)、HelloworldImpl
package com.luoshengsha.ws.impl; import com.luoshengsha.ws.Helloworld; public class HelloworldImpl implements Helloworld { public void say(String name) { System.out.println("欢迎你,"+name+"!"); } }
4、安全校验的定义
(1)、ServerPasswordCallback
package com.luoshengsha.ws; 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 ServerPasswordCallback implements CallbackHandler { @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; if (pc.getIdentifier().equals("luoshengsha")) {//判断来自客户端的用户名是否是指定的用户名 // set the password on the callback. This will be compared to the // password which was sent from the client. pc.setPassword("lss123");//服务器端配置密码,与客户端的密码保持一致 } } }
(2)、ClientPasswordCallback
package com.luoshengsha.ws; 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 ClientPasswordCallback implements CallbackHandler { @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; pc.setPassword("lss123");//客户端配置密码 } }
5、spring相关配置文件
(1)、beans.xml
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <context:annotation-config /> <aop:aspectj-autoproxy/> <aop:aspectj-autoproxy proxy-target-class="true"/> <context:component-scan base-package="com.luoshengsha" /> </beans>
(2)、cxf-beans.xml
<?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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <!-- 定义安全校验器 --> <bean id="wss4jInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor"> <constructor-arg> <map> <entry key="action" value="UsernameToken"/> <entry key="passwordType" value="PasswordText"/> <!-- <entry key="signaturePropFile" value="..."/> --> <entry key="user" value="luoshengsha"/><!--设置服务器端用户名--> <entry key="passwordCallbackClass" value="com.luoshengsha.ws.ServerPasswordCallback"/> </map> </constructor-arg> </bean> <!-- helloworld webservice接口 --> <jaxws:endpoint id="helloWebservice" implementor="com.luoshengsha.ws.impl.HelloworldImpl" address="/helloworld_ws"> <jaxws:inInterceptors> <ref bean="wss4jInInterceptor"/> </jaxws:inInterceptors> </jaxws:endpoint> </beans>
(3)、cxfClient-beans.xml
<?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" 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"> <!-- 定义安全校验器 --> <bean id="wss4jInInterceptor2" 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="luoshengsha"/><!--设置客户端用户名--> <entry key="passwordCallbackClass" value="com.luoshengsha.ws.ClientPasswordCallback"/> </map> </constructor-arg> </bean> <!-- 邮件客户端webservice --> <jaxws:client id="helloworldlClient" serviceClass="com.luoshengsha.ws.Helloworld" address="http://localhost:8080/ws/helloworld_ws" > <jaxws:outInterceptors> <ref bean="wss4jInInterceptor2"/> </jaxws:outInterceptors> </jaxws:client> </beans>
6、单元测试WebServiceTest.java
package com.luoshengsha.test; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.luoshengsha.ws.Helloworld; public class WebServiceTest { private static Helloworld helloworld; @BeforeClass public static void setUpBeforeClass() throws Exception { try { ApplicationContext cxt = new ClassPathXmlApplicationContext(new String[] {"beans.xml","cxfClient-beans.xml"}); helloworld = (Helloworld)cxt.getBean("helloworldlClient"); } catch (Exception e) { e.printStackTrace(); } } @Test public void say() { helloworld.say("罗生沙"); } } 7、源码下载地址:http://pan.baidu.com/s/1i3qkesH
本文出自 luoshengsha.com,欢迎转载,转载时请注明出处及相应链接。
本文永久链接: http://www.luoshengsha.com/356.html
相关推荐
5. 安全性:通过WSS,CXF提供了一套完整的安全解决方案,包括基本认证、数字签名、消息加密等。 6. 传输协议:CXF不仅支持HTTP/S,还可以通过JMS、JBI等多种传输协议。 在实际开发中,使用CXF可以极大地简化Web服务...
4. **发布服务**: 使用`@WebService`注解标记服务接口,并通过CXF的`JaxWsServerFactoryBean`在特定端口上发布服务。 **二、WSS4J安全认证** WSS4J(Web Services Security for Java)是Apache的一个项目,它提供...
在本示例中,"webservice+cxf+wss4j+spring"的整合过程可能包括以下步骤: 1. **设置Spring配置**:首先,我们需要在Spring配置文件中定义CXF服务端点和WSS4J的安全策略。这可能涉及到创建bean,如`...
【标题】"Webservice CXF Jar包"是一个用于构建Web服务的开源框架,它整合了Apache CXF项目的核心库。这个包中包含了多个组件和依赖,以支持开发、部署和运行基于SOAP和RESTful风格的Web服务。 【描述】提到的...
在提供的文件`wsserver2`和`cxf_webservice_android`中,很可能是服务器端的配置和Android客户端的示例代码,具体实现细节需参考这些文件内容。总的来说,实现Android客户端与使用Apache CXF和WSS4J的Web服务的认证...
本示例工程是基于CXF框架构建的一个Webservice应用,该应用集成了Spring框架,以实现更高效的服务管理和依赖注入。CXF是一个开源的Web服务框架,它允许开发者创建和部署SOAP和RESTful服务,同时也支持WS-*标准,如...
【标题】:“WebService+CXF+Spring”是一个关于在Java环境中使用Apache CXF框架与Spring框架集成实现Web服务的专题。Apache CXF是一个开源的Web服务框架,它允许开发人员创建和部署SOAP和RESTful Web服务。Spring...
CXF提供了丰富的安全特性,如WS-Security(WS-SecureConversation、WSS-Timestamp等),支持数字签名、加密、用户名令牌、X.509证书等多种安全策略。开发者可以根据需求选择合适的安全方案。 **7. 性能优化与调试**...
在CXF中,你可以配置`WSS4JOutInterceptor`来添加这些功能。 6. **测试调用**:最后,你可以通过CXF客户端调用Web服务接口,此时ws-security的设置将会自动应用到请求中,保证了调用的安全性。 在提供的压缩包文件...
2. **配置安全策略**:CXF支持通过`WSS4JOutInterceptor`进行安全策略配置。我们需要创建该拦截器并设置适当的属性,如`wsse:UsernameToken`用于用户名和密码认证,或者`wsse:Security`用于更复杂的认证机制。 ```...
CXF使用WSS4J实现WS-Security规范,本例的配置是Timestamp Signature Encrypt,具体使用可以参考我的博客http://blog.csdn.net/wangchsh2008/article/details/6708270
<bean id="wss4jOutInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> <prop key="action">UsernameToken <prop key="passwordType">PasswordText <prop key="wsse.username">...
在这个“CXF webService所需要的jar包”中,我们看到的是一系列关键的库文件,这些文件是CXF运行和实现Web服务功能的基础。 1. **cxf-2.3.3.jar**:这是CXF的核心库文件,包含了CXF的主要功能和API,用于处理Web...
Apache Cxf WebService整合Spring 处理Map、非javabean式的复合类等CXF无法自动转化的类型 CXF为服务器端和客户端添加自定义拦截器进行权限检查验证并且控制台打印日志
【标题】"超简单的webservice调用"涉及的是在Java环境下使用Hutool库进行Web ...最后,如果想要扩展或优化这个示例,可以深入研究Hutool的其他功能,或者考虑使用其他的Web Service客户端库,比如Apache CXF或JAX-WS。
【CXF Webservice初学笔记】 Apache CXF 是一个开源的Web服务框架,它使得开发者可以轻松地创建和部署Web服务。本笔记将探讨CXF的基本概念、如何使用CXF构建Webservice以及与之相关的技术栈,如Spring、Struts2等。...
要深入学习这个主题,可以参考博客“WebService:Axis客户端调用需要身份验证的CXF服务”。这个博客很可能详细解释了如何在实际代码中实现上述步骤,包括如何配置Axis客户端、如何处理认证头以及如何与CXF服务进行...
- **安全认证**:CXF 支持多种安全机制,包括消息头拦截器、WSS4J 和 X509 证书,确保服务的安全通信。 在演示环境中,我们使用 MyEclipse IDE、Tomcat 6 作为应用服务器,以及 CXF 版本为 2.5.5。从 CXF 官网...
antlr-2.7.7.jar aopalliance-1.0.jar ...wss4j-1.6.7.jar xalan-2.7.1.jar xml-resolver-1.2.jar xmlbeans-2.5.0.jar xmlschema-core-2.0.3.jar xmlsec-1.5.2.jar xmltooling-1.3.2-1.jar xsdlib-2010.1.jar
7. `wss4j-1.6.1.jar`: Web Services Security for Java(WSS4J)是Apache CXF项目的一部分,专门用于实现WS-Security规范,提供身份验证、消息完整性、加密等功能。 这些jar包组合在一起,为开发者提供了完整的CXF...