接入了幾個(gè)省的4A顾孽,發(fā)現(xiàn)了一點(diǎn)共性碧绞,記錄一下府框。
技術(shù):axis
axis 1.*
核心jar包(最少需要):
1.axis.jar
2.jaxrpc.jar
3.commons-logging-${version}.jar
4.commons-discovery-${version}.jar
5.wsdl4j-1.5.1.jar
調(diào)用
package ic;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class ICServiceTest1 {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:3000/hy/gw/queryConsignOrder?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
// WSDL里面描述的接口名稱(要調(diào)用的方法)
call.setOperationName("getLisQueryConsignOrder");
// 接口方法的參數(shù)名, 參數(shù)類型,參數(shù)模式 IN(輸入), OUT(輸出) or INOUT(輸入輸出)
call.addParameter("icSystem", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("companyFlag", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("consignOrderNo", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("orderNo", XMLType.XSD_STRING, ParameterMode.IN);
// 設(shè)置被調(diào)用方法的返回值類型
call.setReturnType(XMLType.XSD_STRING);
//設(shè)置方法中參數(shù)的值
Object[] paramValues = new Object[] {"4PL","NJHY,NJHF","TC201309172206",""};
// 給方法傳遞參數(shù),并且調(diào)用方法
String result = (String) call.invoke(paramValues);
System.out.println("result is " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
axis 2.*
核心jar包:
axiom-api-1.2.15.jar
axiom-impl-1.2.15.jar
axis2-adb-1.6.4.jar
axis2-kernel-1.6.4.jar
axis2-transport-http-1.6.4.jar
axis2-transport-local-1.6.4.jar
commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-logging-1.1.1.jar
httpcore-4.0.jar
neethi-3.0.2.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.7.jar
簡(jiǎn)單的WebService
import java.util.Random;
//注意:無(wú)package包聲明
public class SimpleService {
public String getGreeting(String name){
return "Hello " + name;
}
public int getPrice(){
return new Random().nextInt(100);
}
}
調(diào)用
public class RPCClient {
public static String address="http://localhost:8080/axis2/services/SimpleService";
public static void main(String[] args) throws IOException{
Object[] result=invoke("getPrice", new Object[]{}, new Class[]{int.class});
System.out.println(result[0]); // 80
result=invoke("getGreeting", new Object[]{"jack"}, new Class[]{String.class});
System.out.println(result[0]); // Hello jack
}
@SuppressWarnings("rawtypes")
public static Object[] invoke(String method,Object[] params,Class[] classes) throws AxisFault{
//使用RPC方式調(diào)用WebService
RPCServiceClient client=new RPCServiceClient();
Options option=client.getOptions();
//指定調(diào)用的URL
EndpointReference reference=new EndpointReference(address);
option.setTo(reference);
/*
* 設(shè)置要調(diào)用的方法
* http://ws.apache.org/axis2 為默認(rèn)的(無(wú)package的情況)命名空間讥邻,
* 如果有包名迫靖,則為 http://axis2.webservice.elgin.com ,包名倒過(guò)來(lái)即可
* method為方法名稱
*
*/
QName qname=new QName("http://ws.apache.org/axis2", method);
//調(diào)用遠(yuǎn)程方法,并指定方法參數(shù)以及返回值類型
Object[] result=client.invokeBlocking(qname,params,classes);
return result;
}
項(xiàng)目設(shè)計(jì)
4A廠商提供的形式:
- 直接提供webService ,可參考axis2.*兴使,或下面某省提供的
- 提供wsdl系宜,可參考axis1.*
如某省提供的
4A平臺(tái)提供如下應(yīng)用認(rèn)證接口(WebService),用于廠商調(diào)用:
地址: http://10.65.4.109:13001/Venus4A/services/Venus4AService(訪問(wèn)不了wsdl)
方法名:userSecondarySignatureLogin
入?yún)ⅲ?/p>
名稱 | 說(shuō)明 | 類型 | 長(zhǎng)度(字節(jié)) |
---|---|---|---|
resID | 資源編號(hào)发魄,由4A平臺(tái)定義并告知廠商 | Int | -- |
userName | 從帳號(hào)盹牧,即歸屬業(yè)務(wù)系統(tǒng)所用的個(gè)人賬號(hào) | String | 16 |
signature | 憑證信息(采用加密方式) | String | 1024 |
出參:
名稱 | 說(shuō)明 | 類型 | 長(zhǎng)度(字節(jié)) |
---|---|---|---|
result | 認(rèn)證結(jié)果和從帳號(hào) 認(rèn)證結(jié)果:0-失敗 1-成功 | String | 1024 |
result格式參考:
<?xml version="1.0" encoding="UTF-8"?>
<UserSecondary>
<UserName>從帳號(hào)名稱</UserName>
<Result>認(rèn)證結(jié)果</ Result >
</UserSecondary>
調(diào)用方法:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
private static String accessServiceFunction(String endpoint,String function,Object[] obj){
Service service = new Service();
Call call;
String rusult = null;
try {
call = (Call) service.createCall();
URL url = new URL(endpoint);
call.setTargetEndpointAddress(url);
call.setOperationName(function);
return (String)call.invoke(obj);
}catch (Exception e1) {
logger.error("連接認(rèn)證服務(wù)器失敗:" + e1.getMessage());
return rusult = null;
}
}
對(duì)接4A
主要需要實(shí)現(xiàn)登錄與登出
1.登錄
????基本都會(huì)提供username=xxx&token=%&*(!@#()@!#&^($!UIH 這樣的校驗(yàn)參數(shù)欠母。在對(duì)現(xiàn)存系統(tǒng)影響最小的情況下欢策,最理想的方式是新增Filter在第一個(gè)攔截器位置實(shí)現(xiàn)校驗(yàn)。
大致需要實(shí)現(xiàn)下面幾個(gè)方法:
1> 通用驗(yàn)權(quán)赏淌,rpc層校驗(yàn)權(quán)限踩寇,如調(diào)用4A廠商提供的認(rèn)證方法
2> 個(gè)性化權(quán)限控制,如登錄ip限制
3> 登錄至系統(tǒng)六水,實(shí)現(xiàn)login俺孙,如session添加user信息后,chain.doFilter
2.登出
????調(diào)用4A廠商提供的登出方法掷贾,調(diào)用系統(tǒng)自己的登出方法