webService cxf 框架开发的webservice接口

分享基于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); 



=================================第四步   生成客户端==========================命令窗口执行 (之前要配置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()); //追加一个过过滤器


===================== 客户端    第二步 =========================
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; 



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
address=" IsayHelloServer"> 
<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"/>
 
 
 
      
 

猜你喜欢

转载自bigseven.iteye.com/blog/2210271