一, 目的
1. 通过cxf实现webservice服务器端的发布,从而为其他应用提供接口服务
2. 通过cxf调用其他应用提供的webservice服务
二, 说明
此处Cxf 采用的版本为2.1.3,cxf的工具包网上有免费下载。
三, 服务器端实现步骤
1. 将cxf工具包中apache-cxf-2.1.3/lib目录下的所有jar包引入工程里
2. 在web.xml上配置如下:
<servlet>
<servlet-name>CXFServletservlet-name>
<servlet-class>
com.boco.sso.common.servlet.NonSpringServlet
servlet-class>
<load-on-startup>0load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>CXFServletservlet-name>
<url-pattern>/service/*url-pattern>
servlet-mapping>
3. 自己编写一个servlet实现CXFNonSpringServlet,并且重写loadBus方法。
package com.boco.sso.common.servlet;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;
import com.boco.sso.server.MyCallbackHandler;
import com.boco.sso.server.MySoapInterceptor;
import com.boco.sso.server.SSOServerImpl;
public class NonSpringServlet extends CXFNonSpringServlet {
public void loadBus(ServletConfig servletConfig) throws ServletException {
super.loadBus(servletConfig);
// You could add the endpoint publish codes here
// Bus bus = this.getBus();
// BusFactory.setDefaultBus(bus);
// Endpoint.publish("/sso", new SSOServerImpl());
// You can als use the simple frontend API to do this
ServerFactoryBean factroy = new ServerFactoryBean();
factroy.setBus(bus);
factroy.setServiceClass(SSOServerImpl.class);
factroy.setAddress("/sso");
// factroy.getInInterceptors().add(new MySoapInterceptor());//判断ip
factroy.create();
}
}
SSOServerImpl.class 为接口实现类。
/sso 为发布的服务名
该webservice的发布的地址为:http://工程访问路径/service/sso?wsdl
地址中的service是在web.xml的配置的
(<servlet-mapping>
<servlet-name>CXFServletservlet-name>
<url-pattern>/service/*url-pattern>
servlet-mapping>
)
3. 重启服务,然后访问发布的地址,如果能看到发布的服务,并能看到生成的wsdl内容,就说明websevice发布成功了。
四, 客户端调用
1, 需要提供服务的应用提供一个webservice的发布地址如: http://10.221.9.16:19090/transnms/services/SingleSignon?wsdl
2, 在classes目录下定义一个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.0.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-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<bean id="wss4jOutConfiguration"
class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="bocoadmin"/>
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackClass" value="auth.WsClinetAuthHandler" />
map>
constructor-arg>
bean>
beans>
2.通过wsdl2java的命令生成客户端
先进入dos窗口,
进入apache-cxf-2.1.3/bin所在目录,
输入命令:
wsdl2java http://10.221.9.16:19090/transnms/services/SingleSignon?wsdl
命令格式为:wsdl2java url 其中的URL为要调用的webservice的服务地址
3.在beans.xml文件中配置要调用的webservice
类似文件中红色注释的内容:
serviceClass="mobilesso.tnms.ISingleSignon"
address="http://10.221.9.16:19090/transnms/services/SingleSignon">
其中id是自己为该服务起的一个唯一标示,serviceClass为实现接口,在生成的客户端有,address为要调用的webservice地址
4. 调用
定义一个类执行如下代码:
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
//拿到webservice服务的操作接口
ISingleSignon iss = (ISingleSignon)app.getBean("cswg");
//执行服务的具体操作
List list = iss.getAccount("");
System.out.println(list.size());
for(int i=0;i
RemoteUser ru = (RemoteUser)list.get(i);
System.out.println(ru.getUid()+","+ru.getName());
}
System.out.println(iss.authenticate("antest", "abc123"));
System.out.println(iss.modifypwd("antest","ABC123"));
//操作结束
app.close();//一定不要忘记将app关掉