序
中途换换脑子,顺便为以后做储备。看了下license,看到个比较新的smart license工具包。就简单弄弄试试。
一、使用
我是先看的java引入,现在凡是不支持springboot、maven引包的,我基本也不想看。其实也是不想破坏目前的springboot框架。
引包:
<!-- smart-license支持 -->
<dependency>
<groupId>org.smartboot.license</groupId>
<artifactId>license-client</artifactId>
<version>1.0.3</version>
</dependency>
大致使用分2种:
1、通过license授权文件读取是否异常(超期),超期会有异常
2、与souce.txt做还原比对校验
我这里使用的是第一种,抛砖引玉大家自己飞。
二、生成license.txt
我使用的是jdk11,安装文档上的操作,报不能创建虚拟机的错误。在.bat脚本上设置jdk1.8的路径也是这个错,然后我就放弃了,实际看源码,想使用java的方式生成。源码时用的Jd看的,看的tar.gz包的license-service.jar。截图大家看看关键地方:
看到这,再看看其他jar
是不是绝对其他几个jar都有点熟悉,没错,那就是一些常用的jar。是不是觉得妥妥的可以使用java生成了?
三、java方式生成license.txt
这里我先没有试使用maven导入license-server,所以采用的时把这个jar放到项目的lib下,再再pom.xml设置引入lib下的这个jar。研究完成了做代码整理的时候,试了下,居然server包也可以引入
<dependency>
<groupId>org.smartboot.license</groupId>
<artifactId>license-server</artifactId>
<version>1.0.3</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
这里因为它内部也有log,所以排除,不然老提示那个引入多个log的警告。看着日志框打印红色的日志有强迫症。
关键代码,其实就是复制的jar里LicenseServer类的main方法,下面时我建的一个junit测试类,简单试了生成与读取
/**
* @author zhengwen
**/
@Slf4j
public class LicenseTest {
@Test
public void createLicense() throws Exception{
LicenseServer license = new LicenseServer();
String expire = "1h";
//文件
//String data = "E:\\Workspaces\\intellij idea\\NG20\\DSI\\target\\DSI.jar";
//字符串
String data = "zwtest";
String enKey = "";
char type = expire.charAt(expire.length() - 1);
int value = Integer.valueOf(expire.substring(0, expire.length() - 1));
Calendar calendar = Calendar.getInstance();
switch (type) {
case 'h':
case 'H':
calendar.add(Calendar.HOUR, value);
break;
case 'd':
case 'D':
calendar.add(Calendar.DAY_OF_YEAR, value);
break;
case 'y':
case 'Y':
calendar.add(Calendar.YEAR, value);
break;
default:
throw new UnsupportedOperationException(expire);
}
File file = new File(data);
byte[] bytes;
if (file.isFile()) {
log.info("sign for file:{}", file.getPath());
bytes = IOUtils.toByteArray(new FileInputStream(file));
} else {
log.info("sign for string:{}", data);
bytes = data.getBytes();
}
if (StringUtils.isNotBlank(enKey)){
license.createLicense(bytes, calendar.getTime(), Base64.getDecoder().decode(enKey));
} else {
license.createLicense(bytes, calendar.getTime());
}
log.info("--sign end--");
}
//@Test
public void readLicense(){
String licensePath = "E:\\Workspaces\\intellij idea\\NG20\\DSI";
File file = new File(licensePath + File.separator +"license.txt");
License license = new License();
LicenseEntity licenseEntity = license.loadLicense(file);
System.out.println(new String(licenseEntity.getData()));
}
}
四、我的简单使用
我这里是一个springboot项目,不想破坏太多代码,毕竟这个上面还没说用不用了,所以就封装了校验读取方法,在项目的启动类上加个先判断license校验。
校验工具类
/**
* License简单工具类
* @author zhengwen
**/
@Slf4j
public class LicenseUtil {
/**
* license文件校验
* @return 是否过期
*/
public static boolean checkSoftLicense() {
boolean licensePass = true;
String path = System.getProperty("user.dir");
File file = new File(path,"license.txt");
License license = new License();
try {
LicenseEntity licenseEntity = license.loadLicense(file);
log.debug("-------license加密文件选的内容:{}",new String(licenseEntity.getData()));
//System.out.println(new String(licenseEntity.getData()));
}catch (LicenseException e){
log.error("---license授权文件异常---");
licensePass = false;
}
return licensePass;
}
}
启动类增加
public static void main(String[] args) {
//可能会遇到user.dir路径读取的问题,先这样简单处理,还有种方式是可以使用路径配置,再config里配置类里校验,那样要修改没这方便,反正是先研究使用而已
boolean licensePass = LicenseUtil.checkSoftLicense();
if (licensePass){
SpringApplication.run(DsiApplication.class, args);
System.out.println("--数据服务接口启动成功--");
}else {
System.out.println("--数据服务接口license校验不通过--");
}
}
到此就ok了,先校验是否过期,没过期项目就继续启动。
五、说说问题
1、生成license.txt慢,之前我是想用项目的jar生成,生成倒是没问题,就是慢。在一个就是生成的license文件比我的jar文件还大,这显然不行。
2、建议把校验方式也写道client里,让用户无感的,配置个license.txt路径,调用下方法,传入路径、key等返回布尔值就行(当然这个我们也可以自己做)。
就这2点吧,用这个给重要文件或者部署服务器的mac、ip等生成一个就license就行,校验逻辑,我们可以自行校验(项目读取mac、ip等等进行比对校验,双保险)
这个嘛,其实也没有什么特别的,毕竟现在这种方式只要知道生成逻辑就可以破。现在很多都是采用的授权服务器传参校验,动态授权、生成授权文件的。但是有些项目是没有外网的,所以这种方式也是ok的,防君子不防小人。