java applet调用客户端dll 简单案例

一、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
{
	@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

    
   现在就可以测试一下我们的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

输入的主密码
	(如果和 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中

       然后我们再去访问页面会发现出现一个 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.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

输入的主密码
	(如果和 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
保存在文件中的认证 

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中


你可能感兴趣的:(跨语言代码编写)