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());
}
}