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

2024-05-07 08:18

本文主要是介绍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

    <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中

       然后我们再去访问页面会发现出现一个 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输入<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:37SHA1: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 简单案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966813

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2