CXF接口服务端开发

spring配置文件

<?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:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://cxf.apache.org/jaxws
	http://cxf.apache.org/schemas/jaxws.xsd"
       default-lazy-init="false" default-autowire="byName">

    <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="pscCapacityWebService" class="com.jd.lms.ws.impl.PscSoapWebServiceImpl"/>
    
    <bean id="logIn" class="org.apache.cxf.interceptor.LoggingInInterceptor" />
    <bean id="logOut" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
    
    
    <jaxws:server id="pscSoap" serviceClass="com.jd.lms.ws.PscSoapWebService" address="/pscCapacity">
	    <jaxws:serviceBean>
	        <!-- 要暴露的 bean 的引用 -->
	        <ref bean="pscCapacityWebService"/>
	    </jaxws:serviceBean>
	    <jaxws:inInterceptors>
            <ref bean="logIn"/>
            <bean class="com.jd.lms.ws.intercepter.CheckSOAPHeaderIntercepter">
				<property name="authHeader">
					<bean class="com.jd.common.ws.AuthHeader">
					  <property name="key" value="AuthenticationHeader" /> 
					  <property name="qName" value="http://lms.jd.com/" /> 
					  <property name="content" value="123456" /> 
					  <property name="seed" value="123456" /> 
					 </bean>
				 </property>
			</bean>
        </jaxws:inInterceptors>
        <jaxws:outInterceptors>
            <ref bean="logOut"/>
        </jaxws:outInterceptors>
	</jaxws:server>

</beans>

提供服务的接口

package com.jd.lms.ws;

import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import com.jd.lms.domain.psc.webservice.PscCapacityWsParam;
import com.jd.lms.domain.psc.webservice.PscCapacityWsResult;



@WebService
@SOAPBinding(style = Style.RPC)
public interface PscSoapWebService {
	public PscCapacityWsResult queryArrangeNumByDate(@WebParam(name = "pscCapacityWsParam") PscCapacityWsParam pscCapacityWsParam);
}

接口实现类

package com.jd.lms.ws.impl;
import javax.annotation.Resource;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.jd.lms.domain.psc.webservice.PscCapacityWsParam;
import com.jd.lms.domain.psc.webservice.PscCapacityWsResult;
import com.jd.lms.service.psc.PscCapacityService;
import com.jd.lms.ws.PscSoapWebService;


@WebService
@SOAPBinding(style = Style.RPC)
public class PscSoapWebServiceImpl implements PscSoapWebService{
	private static final Log log = LogFactory.getLog(PscSoapWebServiceImpl.class);
	private static final String QUERYBOOKNUMBYTIME_START="queryBookNumByTime开始";
	private static final String QUERYBOOKNUMBYTIME_END="queryBookNumByTime结束";
	
	@Resource
	private PscCapacityService pscCapacityService;
	
	/** 根据天,时间段获取预约量
	 * 2013-6-6
	 * @param pscCapacityWsParam
	 * @return
	 */
	public PscCapacityWsResult queryArrangeNumByDate(@WebParam(name = "pscCapacityWsParam") PscCapacityWsParam pscCapacityWsParam){
		log.info(QUERYBOOKNUMBYTIME_START);
		PscCapacityWsResult result = new PscCapacityWsResult();
		try {
			if(null==pscCapacityWsParam.getDeliverCenterId()||null==pscCapacityWsParam.getBranchId()||null==pscCapacityWsParam.getWareHouseId()
					||null==pscCapacityWsParam.getArrangeDate()||null==pscCapacityWsParam.getActivityCode())
			{
				result.setResultCode(2);
			}else{
				result = pscCapacityService.queryArrangeInfo(pscCapacityWsParam);
				
				if(result.equals(null))
				{
					result.setResultCode(0);
				}else
				{
					//成功返回1
					result.setResultCode(1);
				}
			}
		} catch (Exception ex) {
			log.error(ex.getMessage(), ex);
			result.setResultCode(0);
		}
		log.info(QUERYBOOKNUMBYTIME_END);
		return result;
	}
}

安全验证拦截器

package com.jd.lms.ws.intercepter;

import javax.xml.namespace.QName;

import org.apache.commons.lang.StringUtils;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;

import com.jd.common.ws.AuthHeader;

public class CheckSOAPHeaderIntercepter extends AbstractPhaseInterceptor<SoapMessage> {

	private Logger logger = Logger.getLogger(getClass());

	private AuthHeader authHeader;

	public CheckSOAPHeaderIntercepter() {
		super(Phase.PRE_PROTOCOL);
		getAfter().add(SAAJInInterceptor.class.getName());
	}

	public void handleMessage(SoapMessage message) throws Fault {
		if (authHeader == null) {
			throw new IllegalArgumentException("authHeader must set!");
		}
		org.apache.cxf.binding.soap.SoapHeader soapHeader = (org.apache.cxf.binding.soap.SoapHeader) message
				.getHeader(new QName(authHeader.getqName(), authHeader.getKey()));
		if (soapHeader == null) {
			throw new IllegalArgumentException("Token null! ");
		}
		Element ei = (Element) soapHeader.getObject();
		String token = null;
		try {
			org.w3c.dom.Node node = ei.getFirstChild().getFirstChild();
			if (node != null) {
				token = node.getTextContent();
			} else {
				token = "";
			}
		} catch (Exception e) {
			logger.error("token:" + token);
			throw new IllegalArgumentException("Token wrong! ");
		}
		boolean b = checkTokenValue(token);
		if (!b) {
			throw new IllegalArgumentException("Token wrong! ");
		}
	}

	private boolean checkTokenValue(String token) {
		String tmp = authHeader.getTokenValue();
		if (StringUtils.isEmpty(tmp)) {
			return true;
		}
		if (StringUtils.isEmpty(token)) {
			return false;
		}
		return tmp.equals(token);
	}

	public void setAuthHeader(AuthHeader authHeader) {
		this.authHeader = authHeader;
	}

}


客户端调用测试类


package com.jd.common.ws;

import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.namespace.QName;
import java.util.List;

/**
 * token��֤
 * User: sunbingwei
 * Date: 2010-5-22
 * Time: 18:01:15
 */
public class SOAPHeaderIntercepter extends AbstractSoapInterceptor {
    private AuthHeader authHeader;
    public SOAPHeaderIntercepter(){
		super(Phase.WRITE);
	}


    public void handleMessage(SoapMessage soapMessage) throws Fault {
        List headers=soapMessage.getHeaders();
		headers.add(getHeader());
    }

    private Object getHeader() {
		QName qName=new QName(authHeader.getqName(), authHeader.getKey(), "");
		Document document= DOMUtils.createDocument();
		Element element=document.createElementNS(authHeader.getqName(), authHeader.getKey());
		Element token = document.createElement(authHeader.getToken());
		token.setTextContent(authHeader.getTokenValue());
		element.appendChild(token);
		SoapHeader header=new SoapHeader(qName, element);
		return(header);
	}

    public AuthHeader getAuthHeader() {
        return authHeader;
    }

    public void setAuthHeader(AuthHeader authHeader) {
        this.authHeader = authHeader;
    }
}

package com.jd.common.ws;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;

/**
 * jd token��֤head��ɷ�ʽ
 * User: sunbingwei
 * Date: 2010-5-22
 * Time: 18:23:18
 */
public class AuthHeader {
    private final static String QNAME ="http://www.360buy.com/";
     private String KEY = "AuthenticationHeader";
    private String TOKEN = "Token";
    private  String qName ;
    private String key ;
    private String token ;
    private String content;
    private String seed;

    public AuthHeader(){}

    public String getTokenValue(){
        if(StringUtils.isNotEmpty( content )) {
            if(StringUtils.isNotEmpty(seed)){
                byte[] bb = MD5Util.md5( content + "-" + seed );
                return new String(Base64.encodeBase64(bb));
            } else {
                return content;
            }
        }
        return "";
    }

    public String getqName() {
        if( StringUtils.isEmpty(qName) ){
            qName = QNAME;
        }
        return qName;
    }

    public void setqName(String qName) {
        this.qName = qName;
    }

    public String getKey() {
        if( StringUtils.isEmpty(key) ){
            key = KEY;
        }
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getToken() {
        if( StringUtils.isEmpty(token) ){
            token = TOKEN;
        }
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getSeed() {
        return seed;
    }

    public void setSeed(String seed) {
        this.seed = seed;
    }
}


package com.jd.lms.test.psc;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.handler.Handler;

import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.message.Message;

import com.jd.common.ws.AuthHeader;
import com.jd.common.ws.SOAPHeaderIntercepter;
import com.jd.lms.rpc.generated.psc.PscCapacityWsParam;
import com.jd.lms.rpc.generated.psc.PscCapacityWsResult;
import com.jd.lms.rpc.generated.psc.PscSoapWebService;
import com.jd.lms.ws.intercepter.CheckSOAPHeaderIntercepter;

public class TestPsc {
	
	public static void main(String[] args) {
	        //调用WebService
		SOAPHeaderIntercepter ci = new SOAPHeaderIntercepter();
        AuthHeader authHeader = new AuthHeader();
        authHeader.setContent("123456");
        authHeader.setKey("AuthenticationHeader");
        authHeader.setqName("http://lms.jd.com/");
        authHeader.setSeed("123456");
        ci.setAuthHeader(authHeader);
		
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(PscSoapWebService.class);
        factory.setAddress("http://ws.lms.jd.com/services/pscCapacity");
        List<Interceptor<? extends Message>> interceptors = new ArrayList();
        interceptors.add(ci);
        factory.setOutInterceptors(interceptors);
        factory.setInInterceptors(interceptors);        
        
        PscSoapWebService service = (PscSoapWebService) factory.create();
        
        System.out.println("#############Client getUserByName##############");
        PscCapacityWsParam pscCapacityWsParam = new PscCapacityWsParam();
        pscCapacityWsParam.setBranchId(611);
        pscCapacityWsParam.setDeliverCenterId(9);
        pscCapacityWsParam.setWareHouseId(5);
        pscCapacityWsParam.setArrangeDate("2013-06-20");
        pscCapacityWsParam.setActivityCode("PCORDER");
        
        PscCapacityWsResult result=service.queryArrangeNumByDate(pscCapacityWsParam);
        System.out.print(result.getResultCode());
        System.out.print(result.getActivityCode());
        
        
    }

}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值