接入了几个省的4A,发现了一点共性,记录一下。
技术: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
调用
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里面描述的接口名称(要调用的方法)
call.setOperationName("getLisQueryConsignOrder");
// 接口方法的参数名, 参数类型,参数模式 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);
// 设置被调用方法的返回值类型
call.setReturnType(XMLType.XSD_STRING);
//设置方法中参数的值
Object[] paramValues = new Object[] {"4PL","NJHY,NJHF","TC201309172206",""};
// 给方法传递参数,并且调用方法
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
简单的WebService
import java.util.Random;
//注意:无package包声明
public class SimpleService {
public String getGreeting(String name){
return "Hello " + name;
}
public int getPrice(){
return new Random().nextInt(100);
}
}
调用
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方式调用WebService
RPCServiceClient client=new RPCServiceClient();
Options option=client.getOptions();
//指定调用的URL
EndpointReference reference=new EndpointReference(address);
option.setTo(reference);
/*
* 设置要调用的方法
* http://ws.apache.org/axis2 为默认的(无package的情况)命名空间,
* 如果有包名,则为 http://axis2.webservice.elgin.com ,包名倒过来即可
* method为方法名称
*
*/
QName qname=new QName("http://ws.apache.org/axis2", method);
//调用远程方法,并指定方法参数以及返回值类型
Object[] result=client.invokeBlocking(qname,params,classes);
return result;
}
项目设计
4A厂商提供的形式:
- 直接提供webService ,可参考axis2.*,或下面某省提供的
- 提供wsdl,可参考axis1.*
如某省提供的
4A平台提供如下应用认证接口(WebService),用于厂商调用:
地址: http://10.65.4.109:13001/Venus4A/services/Venus4AService(访问不了wsdl)
方法名:userSecondarySignatureLogin
入参:
名称 | 说明 | 类型 | 长度(字节) |
---|---|---|---|
resID | 资源编号,由4A平台定义并告知厂商 | Int | -- |
userName | 从帐号,即归属业务系统所用的个人账号 | String | 16 |
signature | 凭证信息(采用加密方式) | String | 1024 |
出参:
名称 | 说明 | 类型 | 长度(字节) |
---|---|---|---|
result | 认证结果和从帐号 认证结果:0-失败 1-成功 | String | 1024 |
result格式参考:
<?xml version="1.0" encoding="UTF-8"?>
<UserSecondary>
<UserName>从帐号名称</UserName>
<Result>认证结果</ Result >
</UserSecondary>
调用方法:
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("连接认证服务器失败:" + e1.getMessage());
return rusult = null;
}
}
对接4A
主要需要实现登录与登出
1.登录
基本都会提供username=xxx&token=%&*(!@#()@!#&^($!UIH 这样的校验参数。在对现存系统影响最小的情况下,最理想的方式是新增Filter在第一个拦截器位置实现校验。
大致需要实现下面几个方法:
1> 通用验权,rpc层校验权限,如调用4A厂商提供的认证方法
2> 个性化权限控制,如登录ip限制
3> 登录至系统,实现login,如session添加user信息后,chain.doFilter
2.登出
调用4A厂商提供的登出方法,调用系统自己的登出方法