本文提供了Java代码示例,用于实现免登功能,通过组合数据中心ID、用户名、应用ID、应用秘钥和当前时间戳等参数,并对其进行排序、拼接、SHA加密生成签名,最终组装成URL参数或JSON字符串,实现免登访问金蝶云星空系统。文章还包含了对导入Base64库的疑问解答,并提供了相关参考文档链接,以便进一步了解免登功能和相关技术实现。
【免登功能 - 使用Java代码生成简单认证参数例子篇】
老多同学都在纠结Java生成问题,现把免登功能的java代码独立成篇,方便阅读和查找。
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
//这个不要引用,否则编码会错误
//import org.apache.commons.codec.binary.Base64;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.codec.digest.DigestUtils;
public class HellWorld {
public static void main(String[] args) throws UnsupportedEncodingException
{
String dbId = "xxxx"; //数据中心ID
String usserName = "DEMO"; //用户名称
String appId = "OA"; //第三方系统应用Id
String appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; //第三方系统应用秘钥
long currentTime=System.currentTimeMillis()/1000; // 当前时间(秒)
String timestamp=Long.toString(currentTime);
String[] strArray ={dbId, usserName, appId, appSecret,timestamp};
Output("Before Sigend",strArray);
//签名字符串数组需要排序,后生成签名
Arrays.sort(strArray);
Output("After Sigend",strArray);
String combStr=null;
for(int i=0;i<strArray.length;i++) {
if(combStr==null || combStr==""){
combStr = strArray[i];
}else{
combStr= combStr+strArray[i];
}
}
byte[] strByte = combStr.getBytes("UTF-8");
Output("utf8 bytes",strByte);
byte[] strSign = DigestUtils.sha(strByte);
String sign = bytesToHexString(strSign);
Output("signedData",sign);
//V1版本参数格式(https://vip.kingdee.com/article/8927)
//String urlPara = String.format("|%s|%s|%s|%s|%s|%s", dbId, usserName, appId, sign, timestamp, "2052");
//V2版本参数格式(https://vip.kingdee.com/article/8928)
// * json表达式不要存在空格,避免url编码后变成+号引起登入错误 *
String urlPara = String.format(
"{dbid:'%s',username:'%s',appid:'%s',signeddata:'%s',timestamp:'%s',lcid:'%s',origintype:'simpas'}",
dbId, usserName, appId, sign, timestamp, "2052");
Output("urlPara",urlPara");
// 金蝶云星空入口链接 urlEncode
Output("urlEncode","https://v7demo.kingdee.com/k3cloud/html5/Index.aspx?ud="
+ java.net.URLEncoder.encode(urlPara, "utf-8"));
// 金蝶云星空入口链接 Base64
//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
Output("base64","https://v7demo.kingdee.com/k3cloud/html5/Index.aspx?ud="
+ Base64.encode(urlPara.getBytes("UTF-8")));
// 默认浏览器打开url
/*
try{
//创建一个URI实例,注意不是URL
java.net.URI uri=java.net.URI.create(url);
//获取当前系统桌面扩展
java.awt.Desktop dp=java.awt.Desktop.getDesktop();
//判断系统桌面是否支持要执行的功能
if(dp.isSupported(java.awt.Desktop.Action.BROWSE)){
//获取系统默认浏览器打开链接
dp.browse(uri);
}
}catch(java.lang.NullPointerException e){
//此为uri为空时抛出异常
}catch(java.io.IOException e){
//此为无法获取系统默认浏览器
}*/
}
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
public static void Output(String title, byte[] ar) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ar.length; i++) {
sb.append(ar[i] + ",");
}
Output(title, sb.toString());
}
public static void Output(String title, String[] ar) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ar.length; i++) {
sb.append(ar[i] + "|");
}
Output(title, sb.toString());
}
public static void Output(String title, String msg) {
System.out.println(title + ":\t\t\t\t" + msg);
}
------------------ Java答疑区 ----------------------
【疑问1】:import com.sun.org.apache.xerces.internal.impl.dv.util.Base64 没有找到,怎么办?
【答】:组件不是JDK标准库,JDK中默认包含了,是可以直接使用的。在eclipse中的解决方法步骤:
点击项目右击鼠标->Properties ->Java Bulid Path->Libraries ->JRESystem Library->Access rules ->双击->Type Access Rules,弹出界面后,在Accessible中点add按钮,弹出界面选accessible,下面填上**点击确定,就解决了。
------------------ 参考帖子区 ----------------------
姐妹篇:
如果使用云星空默认免登逻辑登陆,可以参考下面文档实现外部参数生成即可
【第三方系统单点登录到金蝶云指南V2】
https://vip.kingdee.com/article/9788
【利用启动插件校验机制实现免登录功能,实现跨系统无缝集成】
https://vip.kingdee.com/article/8926
【启动插件校验机制实现免登录功能,【简单通行证】方式】
https://vip.kingdee.com/article/8927
【启动插件校验机制实现免登录功能-支持云之家集成与JSON参数】
https://vip.kingdee.com/article/8928
【自动登录后,实现自动打开某个单据的功能】
https://vip.kingdee.com/article/10881
【免登后,二开如何控制注销后的index.aspx页面自动转向统一认证页面】
https://vip.kingdee.com/article/170637
... ...