java用数字代表拥有的权限,浏览器applet 通过”数字签名” 获得 JNA调用 DLL权限...

先将依赖的DLL放在JRE的bin目录下(注意:浏览器在环境中既有JDK也有JRE调用Applet时,默认使用的是系统中的JRE,只有放在JRE的bin目录下的DLL才会被找到)

使用JNA写个DLL库的接口

package com.test;

import com.sun.jna.Native;

import com.sun.jna.ptr.ByteByReference;

import com.sun.jna.win32.StdCallLibrary;

public interface MyLib extends StdCallLibrary{

MyLib Instance = (MyLib)Native.loadLibrary("NJRwCard", MyLib.class);

public int comset(ByteByReference baudrate);

}

再胡乱写个 Applet

package com.test;

import javax.swing.JApplet;

import javax.swing.JLabel;

import com.sun.jna.Memory;

import com.sun.jna.ptr.ByteByReference;

@SuppressWarnings("serial")

public class MyApplet extends JApplet {

int temp;

Memory memory;

static int count = 0;

@Override

public void init() {

ByteByReference baudrate = new ByteByReference();

memory = new Memory(20);

memory.setString(0, "abc");

baudrate.setPointer(memory);

temp = MyLib.Instance.comset(baudrate);

String info = new String();

switch (temp) {

case -1:

info = "配置串口失败!";

break;

default:

info = "自动配置串口成功!";

break;

}

getContentPane().add(new JLabel(info));

}

}

现在可在IDE中Run As Applet 一下,不过有可能失败,由于现在用的是配置的JDK,所以有可能会找不到资源,得在JDK的bin目录下也放一份DLL。

运行通过之后,用IDE将Applet打成Jar包或在命令行中执行以下的语句:

jar

-cvf MyApplet.jar class

就可以写页面了Applet.jsp

code="com.epro.iccard.IcCardApplet"

name="IcCardApplet"

width="320"

archive="iccard.jar,jna.jar;"

height="24">

由于要调用客户端本地的资源,没有权限系统会报拒绝访问的错,故以下采用数字签名的方式,获得授权。

生成证书及签名

1、keytool

-genkey -keystore pepper.store -alias pepper这个命令用来产生一个密匙库,执行完毕后应该在c:/admin中产生一个pepper.store的文件,这里的pepper是我自己的名字,你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。2、keytool

-export -keystore pepper.store -alias pepper -file pepper.cert这个命令用来产生签名时所要用的证书,同样这里的pepper也可以换成你自己需要的名字。这个命令执行完后在c:/admin中产生一个pepper.cert的文件。3、

jarsigner -keystore pepper.store MyApplet.jar pepper这个命令用上面产生的证书将我们的jar文件进行了签名。

虽然已经签过名了,但是此时由于客户端不会主动信任我们的签名,所以还需要有些工作,以获得客户端DLL的读写权限,这里有三种方法(推荐第三种):

方法一,新建策略文件

新建一个策略文件,并把这些策略文件加入(修改文件)1、 在c:/admin中产生一个名为applet.policy的文件,其内容如下:

keystore "file:pepper.store","JKS";

grant signedBy "pepper" {

permission java.io.FilePermission "<< ALL FILES >>","read";

};

这个文件让由pepper签名的Applet拥有本地所有文件的读权限。2、 修改${java.home}/jre/lib/security目录下的java.security,找到下面这两行:policy.url.1=file:${java.home}/lib/security/java.policy

policy.url.2=file:${user.home}/.java.policy在下面添写第三行policy.url.3=file:c:

/admin/applet.policy完成这个修改后我们在前面创建的applet.policy文件才有效。

在WebRoot 下增加Applets目录,并将已签名的applet.jar、 jna.jar置于该路径下

启动Tomcat

好了,现在这个Applet可以运行读写文件的功能了。如果你要考虑在Internet上实现这个Applet,那么你也不需要在所有的客户端均做上面的步骤,你只需要在你的服务器上创建一个目录,例如c:/admin,将这个目录映射为www.testApplet.com/admin。这里的www.testApplet.com是一个假定的网址,将pepper.cert、pepper.store、FileReaderApplet.html、MyApplet.jar以及applet.policy放在这个目录中,然后修改applet.policy文件如下:keystore

“http:// www.testApplet.com/admin/pepper.store”,

”JKS”;grant

signedBy “pepper”{ permission java.io.FilePermission “<>”, “read”;};

3、 而每个客户端仅仅需要修改一下它们的${java.home}/jre/lib/security目录下的java.security文件如下:policy.url.1=file:${java.home}/lib/security/java.policypolicy.url.2=

file:${user.home}/.java.policypolicy.url.3=

http:// www.testApplet.com/admin/applet.policy

当然每个客户端还是需要安装JRE的。

方法二,修改Java默认 安全策略文件(不太安全)

打开${java.home}/lib/security/java.policy文件,增加授权

如果报的异常为:

java.security.AccessControlException: access denied (java.util.PropertyPermission jna.encoding read)

则在在grant后的括号中增加一行对jna.encoding,

read的授权

permission java.util.PropertyPermission “jna.encoding”, “read”;

方法三,使用AccessController.doPrivileged提升代码权限(推荐,无需修改客户端配置):

用此法需注意:执行需要权限的代码需要一个特殊的方法执行,

AccessController.doPrivileged(…)如果信任此签名,将可以执行此代码

在此例中,可以封装一下comset方法:

public static int comset() throws Exception{

int com = AccessController.doPrivileged(new PrivilegedAction() {

public Integer run() {

return instance.comset(baudrate);

}

});

if(com == -1)

throw new Exception("自动配置串口失败!波特率:" + baudrate);

return com;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: java.applet.appletJava中的一个类,用于创建小型的应用程序(applet),可以在网页中运行。它是Java Applet API中的一部分,提供了一些方法和属性,用于管理和控制applet的生命周期、绘制和交互等方面。通过继承该类,可以编写自己的applet程序,并在浏览器中展示。 ### 回答2: Java AppletJava 语言中的一个重要组成部分,它使得开发人员可以在 Web 浏览器中嵌入 Java 应用程序。Java Applet 是一种小型的可执行程序,可以通过 HTML 页面来进行部署和运行。Java Applet 可以在不同的操作系统和 Web 浏览器上运行,不需要用户进行额外的安装和配置操作。 Java Applet 具有很多优点,其中最重要的是它可以在不同的平台上运行。Java 技术的跨平台性使得开发人员可以编写一次代码,然后在不同的操作系统和 Web 浏览器上运行,无需对程序进行任何修改。另外,Java Applet 可以作为一种 Web 编程方式,可以很方便地向用户提供交互式的内容,增强了用户的体验。Java Applet 还具有良好的安全性,由于它的代码都运行在 JVM 中,因此不会对用户计算机造成任何损害。 虽然 Java Applet 有很多优点,但它也存在着一些缺点。首先,Java Applet 需要用户的浏览器支持 Java 插件才能运行。如果用户的浏览器没有安装或者禁用了 Java 插件,那么 Java Applet 就无法运行。另外,Java Applet 在部署和运行过程中也存在着一些限制,例如需要安装到特定的目录中、只能使用特定的类库等,这些限制会给开发人员带来一些不便。 综上所述,Java Applet 是一种非常重要的 Web 编程方式,它可以实现跨平台的特性和良好的安全性,让开发人员可以开发出优秀的 Web 应用程序。虽然 Java Applet 也存在一些缺点,但在现代的 Web 开发中,它仍然是一种非常有价值的技术。 ### 回答3: Java.applet.appletJava编程语言中的一个类,它用于创建和管理AppletApplet是运行在Web浏览器中的小程序,可以为网页增加交互性和动态性。 Java.applet.applet类提供了许多方法,用于创建和运行Applet。它继承了java.awt.Panel类,因此可以创建一个GUI界面,用于显示Applet的内容和用户交互。 其中一些方法是: 1. init()方法:此方法在Applet被加载时调用。可以在此方法中初始化Applet的数据和资源。例如,可以加载图片和音频文件。 2. start()方法:此方法在Applet被加载时调用,以启动Applet的运行。可以在此方法中开始Applet的动画或游戏逻辑。 3. stop()方法:此方法用于暂停Applet的运行。可以在此方法中停止动画或游戏逻辑。 4. destroy()方法:此方法在Applet被卸载时调用。可以在此方法中释放资源,例如关闭文件和网络连接。 Java.applet.applet还可以与其他类库结合使用,例如Java.awt.Graphics和Java.net.URL,以实现更丰富的功能。 需要注意的是,由于安全问题,Web浏览器目前已经不再支持Applet,因此Java.applet.applet类在现代编程环境下的应用已经大大降低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值