有了前面的基础,现在就开始实现snprotector。
这回我们对snprotector又有哪些要求和目标呢?
1。和前面的onceprotector和timeprotector一样要使用简单;
2。用户可以在程序里输入用户名和序列号并验证;
3。允许用户试用;
4。允许验证后继续运行程序。
好了,有了目标之后我们如何管理注册码呢?
放在资源里?放在程序里?这两种方法都不方便批量的分发。
哪里呢?我选择jad里面:)
分发的程序的jad里面有两个用户定义字段:
user: cakec
sn: 8180076728b161326ae2cc61b783b451
他们有什么用?看下去就明白了。
大家是不是又想到一个问题,如何可以像前面的两个protector一样使用简便
只需要判断一下check,又能在用户输入注册码后再继续运行呢?
因为check判断和其它的startapp的初始工作在一个函数里面,难道有什么办法
让函数停止执行?然而如果主进程停止了执行,我又怎么显示输入注册码的界面,
响应用户的输入呢?思考10秒钟然后看我的方案:)
看看你跟我想的是不是一样:利用midlet的生命周期。
大家知道midlet每次pause之后再次切换的时候系统会调用startapp函数,
此时让check通过不就可以了。
ok,下面来看实现:
首先是注册码输入界面sninputui:
package vmlinux.app;
import javax.microedition.lcdui.*;
public class sninputui extends form {
textfield tfuser_;
textfield tfsn_;
public sninputui()
{
super(stringmanager.get("sninputui.title"));
tfuser_=new textfield(stringmanager.get("sninputui.user"),"",20,textfield.any);
tfsn_=new textfield(stringmanager.get("sninputui.sn"),"",60,textfield.any);
this.append(tfuser_);
this.append(tfsn_);
}
public string getuser()
{
return tfuser_.getstring();
}
public string getsn()
{
return tfsn_.getstring();
}
}
这个没有难度,不说了。
然后是snprotector:
我们需要使用新的ui来获取注册信息,所以构造函数是这样:
public snprotector(midlet app)
{
super(app);
ui_=new sninputui();
cmddone_=new command(stringmanager.get("snprotector.done"),command.screen,1);
cmdtry_=new command(stringmanager.get("snprotector.try"),command.screen,2);
ui_.addcommand(cmddone_);
ui_.addcommand(cmdtry_);
}
由于我们已经设置了基类protector为commandlistener,所以需要改造一下基类:
修改protector的commandaction并增加docommand函数
public void commandaction(command c, displayable d) {
if(c==cmdok_)
app_.notifydestroyed();
else
docommand(c);
}
protected void docommand(command c)
{
}
然后在snprotector重写docommand:
protected void docommand(command c)
{
if(c==cmddone_)
{
。。。
}
else if(c==cmdtry_)
{
。。。
}
}
当用户选择注册的时候,要做的工作就是把用户的输入保存起来。
如果用户选择了试用,就需要一个标志,说明用户要试用。
做完这些工作我们还需要提醒用户暂停程序,然后再恢复程序
以便达到我们重新调用startapp的目的。
所以完整的docommand就是这样:
protected void docommand(command c)
{
if(c==cmddone_)
{
sninputui input=((sninputui)ui_);
if(input.getuser().equals(app_.getappproperty("user")))
{
try
{
recordstore.deleterecordstore(snrms);
}
catch(exception ex)
{
//ignore
}
try
{
recordstore rs=recordstore.openrecordstore(snrms,true);
byte[] buf=input.getsn().getbytes();
rs.addrecord(buf,0,buf.length);
rs.closerecordstore();
}
catch(exception ex)
{
system.out.println(ex);
}
showalert();
}
}
else if(c==cmdtry_)
{
tryit=true;
showalert();
}
}
现在已经把用户输入的注册码保存了起来,在决定命运的check函数里就需要
把保存的信息读出来然后对比判断是否有效,这个就是check函数:
public boolean check()
{
if(tryit)
{
tryit=false;
return true;
}
boolean r=true;
try
{
recordstore rs=recordstore.openrecordstore(snrms,true);
recordenumeration e=rs.enumeraterecords(null,null,false);
if(e.hasnextelement())
{
r=checkcode(generate(app_.getappproperty("user"),new string(e.nextrecord())));
}
else
{
r=false;
}
rs.closerecordstore();
}
catch(exception ex)
{
r=false;
}
if(!r)
{
showui();
}
return r;
}
最后就是sn系统的核心checkcode和generate函数。
generate根据用户名和输入的注册码生成注册序列号
然后checkcode比较生成的注册序列号和验证码得出结论。
大家通过开头的注册码是不是已经知道了,我在这个例子中
简单的使用了md5加密来实现这个过程,下面就是实现:
boolean checkcode(byte[] x)
{
boolean r=true;
byte[] s=getcode();
if(x!=null && s!=null && x.length==s.length)
{
for(int i=0;i<x.length;++i)
if(x[i]!=s[i])
{
r=false;
break;
}
}
else
r=false;
return r;
}
byte[] getcode()
{
string sn=app_.getappproperty("sn");
if(sn==null)
return null;
else
{
//deserialize sn from text
return sn.getbytes();
}
}
public byte[] generate(string user,string code)
{
string u=app_.getappproperty("user");
if(u==null !u.equals(user))
return null;
else
{
//compute inner-code from user and code
md5 md5=new md5(user+"\r\n"+code+"\r\nvmlinux snprotector");
try
{
md5.processstring();
return md5.getstringdigest().getbytes();
}
catch(exception ex)
{
system.out.println(ex);
return null;
}
}
}
怎么样,这就是我的snprotector的工作过程。
使用方法:在startapp开始加入if(!new snprotector(this).check())return;
最后你除了要把开头的两条内容加入jad文件还需要告诉用户一个密码:123456
这个就是cakec的注册密码。
这个snprotector距离实际应用还有相当距离,因为加密方法太简单,随便生成密码
代入公式把生成的md5码放到sn里面即可,只能象征性的意思一下。如何有更好的加密算法?
这个话题就太大了:)
有意见或建议请联系vmlinuxx@gmail.com,共同学习,共同提高:)
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器