Applet简介:
与一般的Java应用程序不同,Applet不是通过main方法来运行的。在运行时Applet通常会与用户进行互动,显示动态的画面,并且还会遵循严格的安全检查,阻止潜在的不安全因素(例如根据安全策略,限制Applet对客户端文件系统的访问)。
工作原理:
含有Applet的网页的HTML文件代码中部带有 和这样一对标记,当支持Java的网络浏览器遇到这对标记时,就将下载相应的小应用程序代码并在本地计算机上并借助浏览器中的 Java 虚拟机(JVM)运行工作。执行该Applet。
生命周期:
Applet的运行由浏览器控制,不由Applet中的代码控制.当浏览器载入包含由Applet的Web页面时,它将生成一个 Applet类的对象,然后利用 Applet类对象的五个public的void方法控制Applet的执行,这五个方法如下:init,start,paint,stop,destory;
1、init()
启动Applet,浏览器总是调用Applet类的默认构造器生成对象,然后调用init()方法经行初始化.一般在这个方法中生成Applet运行所需的对象并初始化Applet类的所有数据成员.
2、start()
由浏览器调用.启动或者重新启动Applet.当Applet第一此启动时,start方法将紧跟init()方法后被浏览器调用.如果用户离开当前的 HTML页面后,在重新返回到当前HTML页面时,start()方法也会调用.start()方法一般用来启动applet需要的人和附加线程
3、 paint(Graphics g) paint方法中的Graphics对象g的创建由Applet容器(appletviewer或者Web浏览器)负责.
在init()方法执行结束,start()方法启动之后,就调用此方法画图.另外,每次需要重新绘制Applet时,也将调用此方法.本方法的典型应用,包括是使用Applet容器传递给paint()方法Graphics对象g画图.
4、 stop()
当用户离开包含该Applet的HTML页面时,浏览器调用此方法.stop方法被调用后,将立即停止所有在start()方法中启动的操作.
5、 destory()
在终止Applet运行时,调用destory()方法,以便释放Applet占用的,由本地操作系统管理的任何系统资源.此方法执行之前,总是先调用stop()方法.
简单案例:
1、新建一个web项目:applet
然后新建一个applet类:
package com.coffee.applet; import java.applet.Applet; import java.awt.Graphics; @SuppressWarnings("serial") public class FaceApplet extends Applet { @Override public void paint(Graphics g) { super.paint(g); g.drawRect(0, 0, 499, 149); g.drawString("Hello .FaceApplet..", 5, 70); } }然后在WebRoot下面新建一个applet文件夹,随后在该文件夹下将上面定义的 FaceApplet类,按照全名来定义文件夹层次,然后将FaceApplet.class拷贝到该文件夹下
目录结构如:WebRoot --> applet -->com--> coffee -->applet --->FaceApplet.class
然后在index.jsp中加入applet
<center> <applet alt="当前浏览器不支持Applet" width="400" height="200" code="com.coffee.applet.FaceApplet.class" codebase="<%=basePath%>applet/"></applet> </center>现在就可以测试一下我们的FaceApplet是否能被加载成功了。
接下来我们将来调用客户端的dll,
首先需要创建含有native方法的类(此处省略,这里的dll将沿用之前文章里面生成的face_recognition.dll.然后通过FaceApplet来进行调用其中的方法)
package com.coffee.common; public class FaceRecognition { static { System.loadLibrary("face_recognition"); } public native static String faceRecognition(String faceImgPath); }
关于该dll的生成可以参见:http://blog.csdn.net/u010150082/article/details/12201989
由于要调用客户端本地的资源,没有权限系统会报拒绝访问的错,故以下采用数字签名的方式,获得授权。
步骤:
1、打包相关的类:这里是FaceApplet.class FaceRecognition.class生成的jar包为:fr.jar
2、生成证书:keytool -genkey -keystore fr.keystore -alias Mission
这个命令用来产生一个密匙库,Mission是我自己的名字,你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。
keytool -genkey -keystore fr.keystore -alias Mission 输入keystore密码: 1234567 再次输入新密码: 1234567 您的名字与姓氏是什么? [Unknown]: 您的组织单位名称是什么? [Unknown]: 您的组织名称是什么? [Unknown]: 您所在的城市或区域名称是什么? [Unknown]: 您所在的州或省份名称是什么? [Unknown]: 该单位的两字母国家代码是什么 [Unknown]: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗? [否]: y 输入<Mission>的主密码 (如果和 keystore 密码相同,按回车):jarsigner -keystore ff.keystore ff.jar Mission 该命令是使用密钥为之前的fr.jar进行数字签名。
keytool -export -keystore fr.keystore -alias Mission -file fr.cer: 该命令是输出证书
keytool -import -alias Mission -file fr.cer -keystore 1234567 :该命令是导入证书
keytool -import -alias Mission -file fr.cer -keystore 1234567 输入keystore密码: 1234567 再次输入新密码: 1234567 信任这个认证? [否]: 所有者:CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 签发人:CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 序列号:527de9b9 有效期: Sat Nov 09 15:52:25 CST 2013 至Fri Feb 07 15:52:25 CST 2014 证书指纹: MD5:7A:A1:CA:13:B7:A6:EA:7B:5F:E7:D1:7F:86:62:38:2F SHA1:D7:40:EB:95:4A:56:36:88:F2:D0:79:3E:DB:82:72:AA:6B:5C:3E:07 签名算法名称:SHA1withDSA 版本: 3 y 认证已添加至keystore中
(一般是他报什么错就写什么语句)
permission java.lang.RuntimePermission "loadLibrary.face_recognition","read";
第二个语句是因为让applet能读一些二进制文件
permission java.util.PropertyPermission "file.encoding","read";
这样我们就可以成功调用了。
java 安全策略:
当初始化Policy时,首先装载系统Policy,然后再增加用户Policy,如果两者都不存在,则使用缺省的Policy,即原始的沙箱模型。
下面例举了一些常用语句:
grant {
//对系统和用户目录“读”的权限
permission java.util.PropertyPermission "user.dir", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.util.PropertyPermission "java.home", "read";
permission java.util.PropertyPermission "java.class.path", "read";
permission java.util.PropertyPermission "user.name", "read";
//对线程和线程组的操作权限
permission java.lang.RuntimePermission "modifyThread";
permission java.lang.RuntimePermission "modifyThreadGroup";
//操作Socket端口的各种权限
permission java.net.SocketPermission "-", "listen";
permission java.net.SocketPermission "-", "accept";
permission java.net.SocketPermission "-", "connect";
permission java.net.SocketPermission "-", "read";
permission java.net.SocketPermission "-", "write";
//读写文件的权限
permission java.io.FilePermission "-", "read";
permission java.io.FilePermission "-", "write";
//退出系统的权限,例如System.exit(0)
permission java.lang.RuntimePermission "exitVM";
};
参考收藏:
D:\Workspaces\ccc>jar -cvf ff.jar FaceRecognition.class jar -cvf ff.jar FaceRecognition.class 标明清单(manifest) 增加:FaceRecognition.class(读入= 793) (写出= 449)(压缩了 43%) D:\Workspaces\ccc>keytool -genkey -keystore fa.keystore -alias Mission keytool -genkey -keystore ff.keystore -alias Mission 输入keystore密码: 1234567 再次输入新密码: 1234567 您的名字与姓氏是什么? [Unknown]: 您的组织单位名称是什么? [Unknown]: 您的组织名称是什么? [Unknown]: 您所在的城市或区域名称是什么? [Unknown]: 您所在的州或省份名称是什么? [Unknown]: 该单位的两字母国家代码是什么 [Unknown]: CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗? [否]: y 输入<Mission>的主密码 (如果和 keystore 密码相同,按回车): D:\Workspaces\ccc>jarsigner -keystore fa.keystore fa.jar Mission jarsigner -keystore ff.keystore ff.jar Mission 输入密钥库的口令短语: 1234567 警告: 签名者证书将在六个月内过期。 D:\Workspaces\ccc>keytool -export -keystore fa.keystore -alias Mission -file fa.cer keytool -export -keystore ff.keystore -alias Mission -file ff.cer 输入keystore密码: 1234567 保存在文件中的认证 <ff.cer> D:\Workspaces\ccc>keytool -import -alias Mission -file fa.cer -keystore 1234567 keytool -import -alias Mission -file ff.cer -keystore 1234567 输入keystore密码: 1234567 再次输入新密码: 1234567 所有者:CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 签发人:CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 序列号:527dc965 有效期: Sat Nov 09 13:34:29 CST 2013 至Fri Feb 07 13:34:29 CST 2014 证书指纹: MD5:B3:17:E9:D9:3E:58:1E:C2:79:C0:1B:BA:D6:47:04:37 SHA1:81:CE:12:4A:CE:02:85:08:4E:E8:C0:9B:88:D9:89:57:76:5E:7D:FA 签名算法名称:SHA1withDSA 版本: 3 信任这个认证? [否]: y 认证已添加至keystore中