分享基于webService cxf 框架开发的webservice接口
1 . 一个简单的cxf例子:包含客户端的自动生成.
2. cxf的安全认证.
3.cxf集成至公司框架步骤.
1 . 一个简单的cxf例子:包含客户端的自动生成.
=======================================第一步=========================
package innosoft.java;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* 服务端接口.
*
* @author gaoq
* @date 2014-10-30 下午9:13:49
*/
@WebService
public interface ISayHelloServer {
String sayHello(@WebParam(name = "username") String name);
}
=======================================第二步=========================
package innosoft.java;
import java.util.Date;
import javax.jws.WebService;
/**
* 服务端接口实现类
*
* @author gaoq
* @date 2014-10-30 下午9:48:44
*/
@WebService(endpointInterface = "
innosoft.java.ISayHelloServer", serviceName = "
IsayHelloServer")
public class SayHelloServer implements ISayHelloServer {
@Override
public String sayHello(String name) {
return name + ",Hello " + new Date();
}
}
=================================第三步 发布接口===========================
package innosoft.java;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
/**
* 启动服务端.
*
* @author gaoq
* @date 2014-10-30 下午9:12:02
*/
public class MainServer {
public static void main(String[] args) {
ISayHelloServer sh = new SayHelloServer();
EndpointImpl ei = (EndpointImpl) Endpoint.publish(" http://localhost:9999/IsayHelloServer", sh);
}
}
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
/**
* 启动服务端.
*
* @author gaoq
* @date 2014-10-30 下午9:12:02
*/
public class MainServer {
public static void main(String[] args) {
ISayHelloServer sh = new SayHelloServer();
EndpointImpl ei = (EndpointImpl) Endpoint.publish(" http://localhost:9999/IsayHelloServer", sh);
}
}
=================================第四步 生成客户端==========================命令窗口执行 (之前要配置cxf的path)
wsdl2java
http://localhost
:9999/IsayHelloServer?wsdl
======================== 第五步 客户端调用接口 =====================
package innosoft.java;
/**
* cxf客户端mian入口.
*
* @author gaoq
* @date 2014-10-30 下午9:42:48
*/
public class MainClient {
public static void main(String[] args) {
IsayHelloServer_Service factory = new IsayHelloServer_Service();
ISayHelloServer begin = factory.getSayHelloServerPort();
String context = begin.sayHello("八戒");
System.out.println(context);
}
}
==============================test==============
腾讯QQ是否在线接口 :http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
============================== =================
2.cxf安全认证
=====================
服务端
第一步
=========================
1.添加一个过滤器类
package innosoft.java;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/**
* 服务端加一个过滤器.
*
* @author gaoq
* @date 2014-10-30 下午10:10:37
*/
//通过PhaseIntercptor,可以知道拦截器在那个阶段使用。
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
public AuthInterceptor(){
super(Phase.PRE_INVOKE);
}
//实现自己的拦截器时,需要实现handleMessage方法。
//handleMessage方法中的形参就是被拦截的消息。
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> heads = msg.getHeaders();
if(heads == null || heads.size() < 1){
throw new Fault(new IllegalArgumentException("没有消息"));
}
Header firstHeader = heads.get(0);
Element ele = (Element) firstHeader.getObject();
NodeList id = ele.getElementsByTagName("userId");
NodeList pass = ele.getElementsByTagName("userPass");
if(id.getLength() != 1){
throw new Fault(new IllegalArgumentException("平台授权码不正确"));
}
if(pass.getLength() != 1){
throw new Fault(new IllegalArgumentException("密码不正确"));
}
String userId = id.item(0).getTextContent();
String userPass = pass.item(0).getTextContent();
Map<String, String> map = new HashMap<String, String>();
map.put("111", "101");
map.put("222", "212");
map.put("333", "323");
if(map.containsKey(userId)){
String password = map.get(userId);
if(!password.equals(userPass)){
throw new Fault(new IllegalArgumentException("密码不正确!!!"));
}
}else{
throw new Fault(new IllegalArgumentException("平台授权码不正确!!!"));
}
}
}
2.main方法追加一个过滤器
package innosoft.java;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
/**
* 启动服务端.
*
* @author gaoq
* @date 2014-10-30 下午9:12:02
*/
public class MainServer {
public static void main(String[] args) {
ISayHelloServer sh = new SayHelloServer();
EndpointImpl ei = (EndpointImpl) Endpoint.publish(" http://localhost:9999/IsayHelloServer", sh);
ei.getInInterceptors().add(new AuthInterceptor()); //追加一个过过滤器
}
}
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.EndpointImpl;
/**
* 启动服务端.
*
* @author gaoq
* @date 2014-10-30 下午9:12:02
*/
public class MainServer {
public static void main(String[] args) {
ISayHelloServer sh = new SayHelloServer();
EndpointImpl ei = (EndpointImpl) Endpoint.publish(" http://localhost:9999/IsayHelloServer", sh);
ei.getInInterceptors().add(new AuthInterceptor()); //追加一个过过滤器
}
}
=====================
客户端
第二步
=========================
1.客户端追加一个过滤器
package innosoft.java;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class addHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String userName;
private String password;
public addHeaderInterceptor(String userName,String password){
super(Phase.PREPARE_SEND);
this.userName = userName;
this.password = password;
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers = msg.getHeaders();
Document doc = DOMUtils.createDocument();
Element ele = doc.createElement("logingHeader");
Element name = doc.createElement("userId");
name.setTextContent(this.userName);
Element mima = doc.createElement("userPass");
mima.setTextContent(this.password);
ele.appendChild(name);
ele.appendChild(mima);
headers.add(new Header(new QName(" http://java.innosoft/"), ele));
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class addHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private String userName;
private String password;
public addHeaderInterceptor(String userName,String password){
super(Phase.PREPARE_SEND);
this.userName = userName;
this.password = password;
}
@Override
public void handleMessage(SoapMessage msg) throws Fault {
List<Header> headers = msg.getHeaders();
Document doc = DOMUtils.createDocument();
Element ele = doc.createElement("logingHeader");
Element name = doc.createElement("userId");
name.setTextContent(this.userName);
Element mima = doc.createElement("userPass");
mima.setTextContent(this.password);
ele.appendChild(name);
ele.appendChild(mima);
headers.add(new Header(new QName(" http://java.innosoft/"), ele));
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.客户端在调用接口时要先追加过滤器
package innosoft.java;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
/**
* cxf客户端mian入口.
*
* @author gaoq
* @date 2014-10-30 下午9:42:48
*/
public class MainClient {
public static void main(String[] args) {
IsayHelloServer_Service factory = new IsayHelloServer_Service();
ISayHelloServer begin = factory.getSayHelloServerPort();
Client c = ClientProxy.getClient(begin);
c.getOutInterceptors().add(new addHeaderInterceptor("111", "101"));
String context = begin.sayHello("八戒");
System.out.println(context);
}
}
===========================================================
3.如何整合至框架
1.webservice.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">
<jaxws:server id=" IsayHelloServer" serviceClass=" innosoft.java.ISayHelloServer"
<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">
<jaxws:server id=" IsayHelloServer" serviceClass=" innosoft.java.ISayHelloServer"
address="
IsayHelloServer">
<jaxws:serviceBean>
<bean class=" innosoft.java.SayHelloServer">
</bean>
</jaxws:serviceBean>
<jaxws:inInterceptors>
<bean class=" innosoft.java.AuthInterceptor "/> //服务端的拦截器
</jaxws:inInterceptors>
</jaxws:server>
</beans>
<jaxws:serviceBean>
<bean class=" innosoft.java.SayHelloServer">
</bean>
</jaxws:serviceBean>
<jaxws:inInterceptors>
<bean class=" innosoft.java.AuthInterceptor "/> //服务端的拦截器
</jaxws:inInterceptors>
</jaxws:server>
</beans>
( IsayHelloServer // 服务名称)
(
innosoft.java.ISayHelloServer
//
服务端
接口地址
)
(
innosoft.java.SayHelloServer
//服务端接口实现类地址)
(
innosoft.java.AuthInterceptor
//
服务端的拦截器)
2.在xxx_ds.xml 中引入webservice.xml
<import resource="webservice.xml"/>