《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 1 / 33
《如何用 JAVA 开发绿色软件》
序言
《如何用 JAVA 开发绿色软件》一书是笔者在开发软件“华夏日记本”的过程中总结出来的。
在开发“华夏日记本”的过程中遇到了很多问题。比如:
1、JAVA 开发出来的软件假如用户的机器上没有 JDK,怎么运行?
该如何实现绿色运行(不用安装也可以运行)?
2、软件如果想实现收费的功能,注册码应该如何生成?
3、注册码如何生成才可以避免用户把使用后的注册码公布在网络上,其它人也可以使用?
4、JAVA 编译后的代码很容易就会被反编译了,如何加密生成的 CLASS 文件,才能有效避免
辛辛苦苦写出的代码暴露出来?
5、选择什么类型的数据库才能使用户机器上不安装相应的数据库,软件也可以正常运行?
6、在软件发布后,后期版本升级中假如有新增的功能, 如何升级才能使新增的功能可以使
用,而用户以前的数据也不会丢失?
…………
当时这些问题困扰了我很久,也曾搜索相关方面的资料来看过,但这些资料不是没有,
就是很零散。造成了开发的过程中耗费了很多时间。如今这些问题都被一一解决了,写出来
与大家分享一下,希望对大家能有所帮助,也希望有相关困惑的人能少走弯路。同时也希望
能为 JAVA 绿色软件事业的发展献出绵薄之力!
本书目前在寻找出版社当中,希望出版社相关的人员能联系笔者。
联系方式
电话:13570579680
EMAIL:xianzehua@163.com
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 2 / 33
目录
1.
的可行性 .............................................................. 3
1.1 数年据库存在于用户计算机上的情况 ..................................... 4
1.2 数据库存在于服务器上的情况 ........................................... 5
2. MyEclipse 注册码生成方式 ................................................... 6
2.1 日期不同,生成的注册码是否相同 ....................................... 10
2.2 日期相同,生成的注册码是否不同 ....................................... 11
3. 注册码在项目里面的应用 ................................................... 13
3.1
作成 ........................................................... 13
3.2 工程代码 ........................................................... 18
3.2.1 Index.jsp .................................................... 18
3.2.2 pageNormal.jsp ............................................... 20
3.2.3 pageSenior.jsp ............................................... 21
3.2.4 codeVerify.jsp ............................................... 23
3.2.5 CodeVerify.java .............................................. 25
3.2.6 MyEclipse.java ............................................... 27
3.2.7 Struts.xml ................................................... 27
3.2.8 Web.xml ...................................................... 28
3.2.9 Styles.css ................................................... 28
3.3 程序演示效果 ....................................................... 29
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 3 / 33
软件注册码生成
作者:冼泽华
软件制作过程中,如果我们要对软件进行收费,那么我们就要有相应的措施,如:我们必须要有
自己的注册码系统,给用户提供注册码,用户有了注册码后,才可以使用收费的功能。
本章教读者如何生成软件的注册码。
小安:生成注册码,这个太简单拉。我会生成。
大泽:那小安你说说你的思路。
小安:我先在系统中准备一个预先准备好的注册码,比如:AA-22-CC-EE,然后在提供一个输入
注册码的页面,如果用户输入的注册码和数据库里面的相同,那么就注册成功拉。如果不相同,
就注册失败,这个实现过和和用户登录系统的差不多。我是不是大聪明拉,博士。
哈哈哈。。。(自大的笑)
大泽:小安,你能举一反三,做过登录系统后,想到这样做,不错,不错,值得赞扬。但是你有
没有想过一个这样的问题,数据库中只有一个注册码,假如用户交费后,你把注册码发给用户,
用户把注册码公布到网络上后,那所有人都知道你这个软件的注册码了,谁会还那么傻,交钱来
买软件的注册码?
小安:嗯,这个我还真没想到,不过我假如不是准备好一个注册码,我准备很多个注册码,
用户注册一个后,就在数据库里面把相应的注册码删除了,那么就没有问题拉,即使把注册码公
布到网络上,也不用担心了。
1. 方案的可行性
上面小安说了一个方案,那究竟这个方案可不可行呢?好,我们来看一下小安这个方案的可行性
假如有一张存放注册码的表,如下
ID 注册码
1 AA-22-CC-EE-01
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
用户 A 交钱获取注册码 AA-22-CC-EE-01 后,注册后,相应的注册码会删除,表中的情况如下
ID 注册码
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 4 / 33
用户 B 交钱获取注册码 AA-22-CC-EE-02 后,注册后,相应的注册码会删除,表中的情况如下
ID 注册码
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
小安的方法看似很可行,但是存在一个问题,这个数据库是存在于用户的机器中呢?还是存放在
网络上呢?一般的软件都会有一个数据库,而数据库一般都会在用户的计算机上。
我们先来看数据库存在于用户计算机上的情况
1.1 数年据库存在于用户计算机上的情况
发布软件后,数据库中注册码表的情况如下
ID 注册码
1 AA-22-CC-EE-01
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
用户 A 下载该软件后,使用了一段时间,提示试用期已过,部分高级功能已经不可用,该高级的
功能需要注册后才可以继续使用。于是用户 A 缴费后,获取了一个注册码“AA-22-CC-EE-01”进行
注册。
按照小安的思路,注册后,该注册码删除,那么用户 A 中机器上注册码表中的情况如下
ID 注册码
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
用户 B 刚好也在使用该软件,也出现了提示试用期结束,要注册才可以使用高级功能的情况。
但是用户 B 不想购买注册码,认为在中国用软件就是不用钱的,傻子才会花钱去购买。于是在网
上查找该软件的注册码,正好找到用户 A 在网上公布出来的注册码“AA-22-CC-EE-01”,于是就
用该注册码来试了一下,这里请读者思考一下,用户 B 会不会通过注册验证?
答案是会成功的,因为用户 A 注册成功后,只是删除用户 A 机器上的数据,对用户 B 并不影响,
即用户 B 机器上的注册码表中的情况还是如下
ID 注册码
1 AA-22-CC-EE-01
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 5 / 33
4 AA-22-CC-EE-04
5 -------
所以当然会注册成功了。那我们有无办法改善一下这个方案,让小安的方案可行呢?其实是可以
的,只要我们把注册表的信息放在服务器上面就可以了。
1.2 数据库存在于服务器上的情况
服务器上的注册表信息如下
ID 注册码
1 AA-22-CC-EE-01
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
用户 A 获取注册码“AA-22-CC-EE-01”进行注册后,服务器中数据库对该数据进行删除后,表中
信息如下
ID 注册码
2 AA-22-CC-EE-02
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
用户 B 在网上找到用户 A 公布的注册码“AA-22-CC-EE-01”后,再进行注册,注册肯定不会成功
的。因为注册码表在服务器上,用户 A 和用户 B 用的是同一张表,“AA-22-CC-EE-01”该注册码
注册过一次后已被删除。要想进行注册只能缴费向软件作者要新的注册码。假如用户 B 缴费获取
注册码“AA-22-CC-EE-02”来进行注册后,那么服务器中注册表的情况如下:
ID 注册码
3 AA-22-CC-EE-03
4 AA-22-CC-EE-04
5 -------
其他用户无法通过网上公布出来的注册码进行注册,只能缴费后向软件作者要。也就实现了小安
的思路。
小安:刚才我考虑的不全面,经过博士这样解析,我就完全明白了,用我那种思路,注册码表必
须要放在服务器上,否则是行不通的。
大泽:嗯,小安说的不错,用你的方案,其他表可以放在用户的机器上,但注册码表必须要放在
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 6 / 33
服务器上,但小安你有无想过一个问题?
小安:什么问题?
大泽:拥有自己的服务器,一般是中小企业以上的企业才会有自己的服务器,但作为个人开发的
作品,不太可能有自己的服务器的。这时候你该怎么办呢?
小安:博士,这个?我真的没有考虑过。
大泽:这就是我们接下来要讲的方案
2. MyEclipse 注册码生成方式
我们先看一下 MyEclispe 注册码是如何实现的,MyEclipse 的注册码框如下
我们看到里面有一个序列号,和一个注册码,如果大家有使用过收费软件的话,很多时候都会看
到有类似上面的这个框,但有人也许会问不是只需要序列号或者注册码这两个之中的其中一个就
可以了吗?为什么需要两个?这个序列号和注册码是什么关系?
其实是这样的,注册码是根据序列号来生成的,比如很多软件的注册机,输入序列号后,点击确
定按钮就会生成相应的注册码。那它是怎么生成的呢?就是输入的序列号加上当前的系统时间,
然后把它根据某个规律,把字符串打乱一下就行了。
以下代码描述 MyEclipse 的注册码生成方式
import java.util.Scanner;
/**
* MyEclipse注册码生成方式
*/
public class MyEclipse {
private static final String LL = "Decompiling this copyrighted
software";
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 7 / 33
public MyEclipse(){}
/**
* 具体的Subscription Code生成算法
*/
public String getSerial(String subscriber, String licenseNum) {
// 获得当前日期
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.add(1, 3);// +3年
cal.add(6, -1);// 当前日-1
java.text.NumberFormat nf = new java.text.DecimalFormat("000");
// licenseNum格式化成三位数字
licenseNum = nf.format(Integer.valueOf(licenseNum));
String verTime = new StringBuilder("-").append(
new
java.text.SimpleDateFormat("yyMMdd").format(cal.getTime()))
.append("0").toString();// 日期
String type = "YE3MP-";
String need = new StringBuilder(subscriber.substring(0, 1))
.append(type).append("300").append(licenseNum).append(verTime)
.toString();// 初步注册信息
String dx = new
StringBuilder(need).append(LL).append(subscriber)
.toString();
int suf = this.decode(dx);// 编码初步注册信息
String code = new
StringBuilder(need).append(String.valueOf(suf))
.toString();
return this.change(code);
}
private int decode(String s) {
int i;
char[] ac;
int j;
int k;
i = 0;
ac = s.toCharArray();// 把s转化为单个字符数组
j = 0;
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 8 / 33
k = ac.length;
while (j < k) {
i = (31 * i) + ac[j];// 加密算法
j++;
}
return Math.abs(i);// 取绝对值
}
/**
*
* 变化原则是
* 把数字(10个)或者字母表(大小写个26个)折半对调(两个相互改变),也即
* 0与5对调(0变5,5变0)
* A与N,a与n对调
*
* @param 原字符串
* @return 变化后的字符串
*/
private String change(String s) {
byte[] abyte0;
char[] ac = null;
int i;
int k;
int j;
abyte0 = s.getBytes();
ac = new char[abyte0.length];
i = 0;
k = abyte0.length;
while (i < k) {
j = abyte0[i];
// 0-9,实现01234和56789相应的相互对调,也即0与5对调,1与6对调
if ((j >= 48) && (j <= 57)) {
j = (((j - 48) + 5) % 10) + 48;
} else if ((j >= 65) && (j <= 90)) {// A-Z
j = (((j - 65) + 13) % 26) + 65;
} else if ((j >= 97) && (j <= 122)) {// a-z
j = (((j - 97) + 13) % 26) + 97;
}
ac[i] = (char) j;
i++;
}
return String.valueOf(ac);
}
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 9 / 33
/**
*
* 主方法,首先调用,产生注册码(Subscription Code)
*
* @param args
*/
public static void main(String[] args) {
System.out.print("请输入序列号:");
Scanner scanner = new Scanner(System.in);// 输入流
String subscriber = scanner.nextLine();// 读下一行字符串
MyEclipse myeclipseKeyGen = new MyEclipse();// 实例化
// 后面的参数是一个数字类型的字符串,数字范围为0-999
String subscription_Code =
myeclipseKeyGen.getSerial(subscriber, "1");
System.out.println("\n" + "MyEclipse 注册码生成的结果如下" + "\n");
System.out.println("序列号:" + subscriber);
System.out.println("注册码:" + subscription_Code);
}
}
它的整体思路就是序列号加上当前系统的时间,然后根据某个规律(把数字(10个)或者字母
表(大小写个 26个)折半对调(两个相互改变),也即 0 与 5 对调(0变 5,5 变 0)A 与 N,
a与 n 对调)来生成注册码的。
运行程序上面的程序,出现下面的信息框,等待你输入
在输入序列号那里输入“xianzehua”(可以是其他的字符),得到注册码,如下
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 10 / 33
2.1 日期不同,生成的注册码是否相同
大泽:小安现在我们来把日期更改一下,再运行代码,你仔细观察下运行的结果有什么不同?
小安:嗯,好的,博士。
先把当前系统的时间调为“2012-02-07”,如下图
运行生成 MyEclipse 的代码,得到的结果如下
再把当前的时间改为“2012-02-08”,如下图
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 11 / 33
运行生成 MyEclipse 的代码,行到的结果如下
大泽:小安你看出问题了吗?
小安:好像是日期不一样,就算是相同的序列号,生成的注册码也不一样。
大泽:嗯,不错,回答得很好。
小安:可这样有什么用呀?
大泽:这样是很有用的。比如说今天(2012-02-07)用户 A 购买注册码后,软件开发作者把
注册码“kLR8ZC-855556-60575157530018020”给用户 A。用户 A 用完了以后,就把这个
软件注册码放在了网上。那么这个注册码只能在当天,即(2012-02-07)里使用才有效,到了
(2012-02-08)日后就不能用了。这样软件开发者就不用担心有人在网上发布注册码而导致软件
的销量下降了。
小安:嗯,我明白了。可是在同一天内,生成的注册码会相同吗?
大泽:嗯,那我们来测试一下吧。
2.2 日期相同,生成的注册码是否不同
我们现在来测试在同一天的时间里,生成的注册码是否是相同的。我们先把当前的系统时间调为
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 12 / 33
“2012-02-07 日 09:21 分”
生成的注册码为:
再把当前的系统时间调为“2012-02-07 日 23:23 分”,时间可以为任意,只要是同一天内就
行了。
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 13 / 33
再运行代码,得到的结果如下。多次运行后,发现只要是在同一日内,只要序列号相同,生成的
注册码是不变的。
小安:博士,我看到了,上面的代码,在同一天内,只要序列号相同,生成的注册码是不变的。
大泽:嗯,不错,下面我们就用 MyEclipse 的注册码生成方式来开发一个需要注册码才可以使用
软件高级功能的系统。
小安:很值得期待呀,终于可以开发收费的系统了。以后除了每个月那微薄的工资,还可能有其
他的额外收入。太好了,博士,我们马上开始吧。
3. 注册码在项目里面的应用
3.1 工程作成
新建一个“Web Project”工程
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 14 / 33
输入如下,然后按“Finish”按钮即可。
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 15 / 33
工程栏里面会生成一个“SubscriptionCode”的工程,在“SubscriptionCode”工程上面点击右
键,选择“Properties”,
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 16 / 33
点击后会弹出以下的窗口,在窗口左边点击“Java Build Path”,即可看到以下的页面
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 17 / 33
点击“Add External JARS”,在弹出的窗口中引入 Struts2 的包,
之后,一直按“确定”按钮返回即可。
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 18 / 33
新建 jsp 页面,java 类,struts.xml 等,最终工程的目录结构如下
3.2 工程代码
下面为工程里面文件的具体内容
3.2.1 Index.jsp
收费注册验证主页面
<%@ page contentType="text/html;charset=UTF-8"%>
收费注册验证
页面效果 如下
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 20 / 33
3.2.2 pageNormal.jsp
普通功能页面
<%@ page contentType="text/html;charset=UTF-8"%>
普通功能页面
pageNormal页面,该页面不用收费也
可以浏览 |
|
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 21 / 33
点击返回
|
页面效果 如下
3.2.3 pageSenior.jsp
高级功能页面
<%@ page contentType="text/html;charset=UTF-8"%>
高级功能页面
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 22 / 33
pageSenior页面,该页面需要缴费获
取注册码进行验证后可以浏览 |
|
点击返回
|
页面效果 如下
《如何用 JAVA 开发绿色软件》 软件注册码生成
作者作品:华夏日记本 下载地址:http://blog.sina.com.cn/s/blog_6aad45ef0100pvfe.html
QQ:26680811 EMAIL:xianzehua@163.com 版权所有,请保留 23 / 33
3.2.4 codeVerify.jsp
注册码验证页面
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
注册码验证页面