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计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

Spring Boot 常用注解整理(最全收藏版)

《SpringBoot常用注解整理(最全收藏版)》本文系统整理了常用的Spring/SpringBoot注解,按照功能分类进行介绍,每个注解都会涵盖其含义、提供来源、应用场景以及代码示例,帮助开发... 目录Spring & Spring Boot 常用注解整理一、Spring Boot 核心注解二、Spr