java applet调用客户端dll 简单案例
来源:互联网 发布:剑三2016成女捏脸数据 编辑:程序博客网 时间:2024/06/08 09:15
一、java applet调用客户端dll 简单案例
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{@Overridepublic 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 版本: 3y认证已添加至keystore中
然后我们再去访问页面会发现出现一个RuntimePermission loadLibrary.face_recognition错误,这是因为applet在没有被允许的情况下去获取系统资源。可以在您系统的java运行时包修改一个关于安全的一文件.具体做法是:找到您的ie浏览器使用的jre包,jre1.6.0\lib\security,在这个包下面有个java.policy文件,打开编辑它:在grant里增加2个语句
(一般是他报什么错就写什么语句)
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.classjar -cvf ff.jar FaceRecognition.class标明清单(manifest)增加:FaceRecognition.class(读入= 793) (写出= 449)(压缩了 43%)D:\Workspaces\ccc>keytool -genkey -keystore fa.keystore -alias Missionkeytool -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 Missionjarsigner -keystore ff.keystore ff.jar Mission输入密钥库的口令短语: 1234567警告: 签名者证书将在六个月内过期。D:\Workspaces\ccc>keytool -export -keystore fa.keystore -alias Mission -file fa.cerkeytool -export -keystore ff.keystore -alias Mission -file ff.cer输入keystore密码: 1234567保存在文件中的认证 <ff.cer>D:\Workspaces\ccc>keytool -import -alias Mission -file fa.cer -keystore 1234567keytool -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中
- java applet调用客户端dll 简单案例
- lua调用c++dll 简单案例
- Applet的简单使用案例
- 在java web项目中调用c++的dll程序简单案例
- RESTful的java客户端调用案例源码
- java applet调用JNI
- java applet 简单实例
- Java- 简单接触Applet
- Java applet 写客户端 cookie
- Java Applet读写客户端串口
- 简单新闻客户端案例
- *JAVA调用DLL简单小例子*
- JAVA调用DLL简单小例子
- java applet 编写简单示例
- 浏览器applet 通过"数字签名" 获得 JNA调用 DLL权限
- java applet 一个简单的例子(applet+html)
- java applet 一个简单的例子(applet+html)
- 通过javascript调用Applet程序对客户端文件系统进行操作
- hdu4565 矩阵快速幂
- 关于最新版本(19)的build-tools问题:Unable to execute dex: java.nio.BufferOverflowException
- nginx配置yii的安全
- UML活动图
- nginx 常用
- java applet调用客户端dll 简单案例
- 怎样才能常常保持好心情
- LINUX内核设计与实现之调试
- Django 学习笔记(2)
- Hdu 1878
- select初始化
- 算法实战4:逃跑问题Escape
- SOLIDWORKS高效建模实例(二)
- C语言文件读写函数介绍