`
yaowei06252009
  • 浏览: 85242 次
  • 性别: Icon_minigender_1
  • 来自: 蚌埠
社区版块
存档分类
最新评论

applet操作本地文件

阅读更多

最近开发,遇到一问题,需要用applet来操作本地文件,在网上查了很多资料,研究了三天终于搞定了。做个总结,以便遇

到相同问题的朋友可以做个参考。

正常来说applet是不能操作本地文件的,这是书上说的,其实这也就是java的安全策略, Java应用程序环境的安全策略,详

细说明了对于不同的代码所拥有的不同资源的许可,它由一个Policy对象来表达,Policy是什么?呵呵,一会再说,先别急。那么

applet的安全策略就包括不能对本地文件的读和写。但我们可以自已来改变java的安全策略,这里也就是来改变applet的安全策略,

那么我们用什么来改变java的安全策略呢,这就需要对jre的中配置文件来进行修改,这个文件就是 jre目录下的

lib\security\java.security, 我们可以自已来创建一个安全策略文件,也是就一个扩展名为.policy的文件,在里面我们可以来

写我们自已定义的安全策略,在java.security中,来引用这个文件就行了。policy文件具体怎么来写?java.security中怎么来引用

?下面我会有具体的描述。

以上说了这个多,不得不提的一个东西就是java的数字签名,在网上找了下数字签名的概念。

数字签名:采用加密技术来实现对签名者身份的认证和数据的完整性。简单的说就是你签字的文件别人知道是你签的,并且知

道这个文件是否被修改过。

我们可以通过 数字签名 applet的jar文档来实现控制的策略。

好了,以上都是理论,我们来实际的说下步骤,做个例子。

1 我们先下写个applet,功能是读本地的一个文件。

package jcomponent;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;

public class FileReaderApplet extends Applet {
boolean isStandalone = false;
TextField fileNameField;
TextArea fileArea;

// Get a parameter value
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def)
: (getParameter(key) != null ? getParameter(key) : def);
}

// Construct the applet
public FileReaderApplet() {
}

// Initialize the applet
public void init() {
try {
jbInit();
} catch (Exception e) {
e.printStackTrace();
}
}

// Component initialization
private void jbInit() throws Exception {
this.setSize(new Dimension(400, 300));
this.setLayout(new BorderLayout());
Panel panel = new Panel();
Label label = new Label("File Name");
panel.add(label);
fileNameField = new TextField(25);
panel.add(fileNameField);
Button b = new Button("Open File");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loadFile(fileNameField.getText());
}
});
panel.add(b);
this.add(panel, BorderLayout.NORTH);
fileArea = new TextArea();
this.add(fileArea, BorderLayout.CENTER);
}

public void loadFile(String fileName) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String context = new String();
while ((context = reader.readLine()) != null) {
fileArea.append(context + "/n");
}
reader.close();
} catch (IOException ie) {
fileArea.append(ie.getMessage());
} catch (SecurityException se) {
fileArea
.append("because of security constraint ,it can not do that!");
}
}

// Get Applet information
public String getAppletInfo() {
return "This is an applet can read and write the local file system";
}
}

2 打包jar 文件

jar -cvf MyApplet.jar jcomponent.FileReaderApplet

3 在test.html页面中加入applet

<APPLET
CODEBASE = "."
CODE = "jcomponent.FileReaderApplet.class"
ARCHIVE ="MyClass.jar"
NAME = "TestApplet"
WIDTH = 400
HEIGHT = 300
HSPACE = 0
VSPACE = 0
ALIGN = middle

</APPLET>

这里最好将<applet>标签转成<object>标签,用<object>的好处是,如果客户的机器中没有jre,那么applet是运行不了的,用的

<object>标签后,可以自动下载jre安装到客户端,我感觉这个功能非常好。

可通过HtmlConverter来转。

HtmlConverter工具位于${java_home}/bin下

在doc下进入html页面的相应目录, 输入

HtmlConverter test.html;

这样就完成的转换

转换后的页面变为

<!--"CONVERTED_APPLET"-->

<!-- HTML CONVERTER -->
<object
classid = "clsid:CAFEEFAC-0015-0000-0000-ABCDEFFEDCBA"
codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"
WIDTH = 400 HEIGHT = 300 NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE = 0 >
<PARAM NAME = CODE VALUE = "jcomponent.FileReaderApplet.class" >

<PARAM NAME = CODEBASE VALUE = "." >

<PARAM NAME = ARCHIVE VALUE = "MyApplet.jar" >

<PARAM NAME = NAME VALUE = "TestApplet" >
<param name = "type" value = "application/x-java-applet;jpi-version=1.5">
<param name = "scriptable" value = "false">

<comment>
<embed
type = "application/x-java-applet;jpi-version=1.5" \
CODE = "jcomponent.FileReaderApplet.class" \
JAVA_CODEBASE = "." \
ARCHIVE = "MyApplet.jar" \
NAME = "TestApplet" \
WIDTH = 400 \
HEIGHT = 300 \
ALIGN = middle \
VSPACE = 0 \
HSPACE = 0
scriptable = false
pluginspage = "http://java.sun.com/products/plugin/index.html#download">
<noembed>

</noembed>
</embed>
</comment>
</object>

<!--
<APPLET CODE = "jcomponent.FileReaderApplet.class" JAVA_CODEBASE = "." ARCHIVE = "MyApplet.jar" WIDTH = 400 HEIGHT =

300 NAME = "TestApplet" ALIGN = middle VSPACE = 0 HSPACE = 0>

</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->

完成这个步骤后,这个Applet已经可以显示了。但是还不能读写本地的文件系统

4 使用keytool工具生成密匙库

keytool工具位于${java_home}/bin目录下

在DOS窗口中执行命令:keytool -genkey -keystore mytest.store -alias fhx

注意:mytest.store 是你的密匙库的名称,可以随意修改,后缀请不要修改!
fhx为别名,这个也可以改成自己的名称

执行上述命令后,DOS窗口中会提示你输入keystore的密码、你的姓名、组织单位等等信息。这里要注意的是输入密码请记住,后面

要用到的。在最后,我们输入y确认信息。然后再直接回车设置fhx的主密码和store密码一致即可!

5 使用keytool工具导出签名时用到的证书
在DOS窗口中执行命令:keytool -export -keystore mytest.store -alias fhx -file fhx.cert

注意:mytest.store 就是第4步生成的密匙库名称
fhx 也是在第4步中我们指定的别名
fhx.cert 为我们生成的证书的名称,可以自己修改名称,注意后缀不要改

命令执行成功,我们会在当前目录下找到一个fhx.cert文件,这个就是我们刚才生成的证书。


6 使用jarsigner工具签名jar压缩文档
jarsigner工具位于${java_home}/bin目录下;
在当前DOS窗口中执行命令:jarsigner -keystore mytest.store MyApplet.jar fhx
注意:mytest.store 就是我们在第4步中生成的密匙库名称
MyApplet.jar 就是我们这第2步压缩的jar文档
fhx 是提供者的名称,我们这里设置为我们的别名

7 创建访问策略文件mytest.policy文件
在当前目录下创建一个mytest.policy文件,其内容如下

keystore "file:c: /test/mytest.store", "JKS";
grant signedBy "fhx"
{ permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";
};


这个文件的意思就是说让所有由fhx签名的applet都可以对本地的所有文件进行读,写,删除的操作

修改${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:/test/mytest.policy

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

如果你要考虑在Internet上实现这个Applet,那么你也不需要在所有的客户端均做上面的步骤,你只需要在你的服务器上创建一个目

录,例如c:/test,将这个目录映射为www.testApplet.com/admin。这里的www.testApplet.com是一个假定的网址,将mytest.cert、

mytest.store、test.html、MyApplet.jar以及mytest.policy放在这个目录中,然后修改test.policy文件如下

keystore "http:// www.testApplet.com/test/mytest.store", "JKS";
grant signedBy "fhx"
{ permission java.io.FilePermission "<<ALL FILES>>", "read";
};

而每个客户端仅仅需要修改一下它们的${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= http:// www.testApplet.com/admin/mytest.policy

好了,现在你可以运行一下test.html看看效果了,在文本框中输入你的本地文件位置,然后点击 open File按钮,在下面的文件框

中就会读出你的文件内容。

下面还有段程序是读一个文件内容到另一个文件中,读写的功能都有了,你可以试下

import java.awt.*;
import java.io.*;
import java.applet.*;

public class AppletFileInputStream extends Applet {
byte buffer[] = new byte[5200];
int m_bytes;
TextArea hArea = new TextArea("", 20, 80);

public void init() {
this.add(hArea);
}

public void paint(Graphics g) {
try {
FileInputStream file1 = new FileInputStream( "d:/AppletFileInputStream.java");
m_bytes = file1.read(buffer, 0, 5200);
String hstr = new String(buffer, 0, 0, m_bytes);

hArea.appendText(hstr);
file1.close();
} catch (Exception e) {
hArea.appendText("read err" + "\n");
}
try {
FileOutputStream file2 = new FileOutputStream("d:/temp.txt");
file2.write(buffer);
file2.close();
} catch (Exception e) {
hArea.appendText("write err" + "\n");
}
}
}

分享到:
评论
2 楼 ganky 2011-01-25  
果然好麻烦啊……
1 楼 bcw104 2010-11-12  
原来以前做applet这么麻烦,现在ide都给做了,点一下鼠标全都解决了

相关推荐

    java applet 操作本地文件

    转载:applet来操作本地文件。 数字签名:采用加密技术来实现对签名者身份的认证和数据的完整性。简单的说就是你签字的文件别人知道是你签的,并且知道这个文件是否被修改过。 我们可以通过 数字签名 applet的jar...

    applet下载操作及权限问题

    applet下载操作实例,对本地文件操作署名问题。

    applet签名的方法

    当你applet要进行客户端操作时,如读取本地文件,沙箱原理使你的applet必须得到信任,此时对applet进行签名就可以解决这个问题

    BREW Applet管理机制

    BREW的Applet分为静态的Applet和动态的Applet。静态的Applet是通过静态编译,将本地的Applet和手机平台软件,操作系统编译在一起下载到手机上的Applet。而动态Applet只需要编译成单个.mod文件即可。

    Java项目源码之图片浏览小程序的实现(java+applet).zip

    文件IO操作:通过Java的文件IO操作读取本地文件系统中的图片文件,实现图片加载功能。 功能扩展: 图片编辑:可选的功能,允许用户对图片进行简单的编辑,如旋转、裁剪等。 图片信息显示:提供图片的基本信息显示,...

    图片浏览小程序(java+applet).zip

    "图片浏览小程序(java+applet).zip"是一个基于Java语言和Applet技术的小程序源码文件包。这个程序主要实现了图片的浏览功能,包括图片的打开、关闭、放大、缩小、旋转等基本操作。此外,还支持图片的上传和下载,...

    627045.rar_文件操作_Java_

    利用javaapplet显示本地日期

    用Delphi实现Word文件的预览

    而这并不影响网页的下载时间,因为在执行 applet 的时候,这部分内存是在本地机器上被分配的。除了作为网页本身的 HTML 文件的内容外,下载时间还取决于 applet 的 .class 文件的大小,以及在它执行时下载的图像或...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java jdk实列宝典 光盘源代码

    操作Excel文件;操作Pdf文件;自定义日志文件类; 8线程 线程的启动 和停止;线程的互斥;线程的协作;线程join;生产者、消费者问题;线程的优先级;列出虚拟机中所有的线程;守护线程Daemon;线程池;一个死锁的...

    轻量级报表制作软件Report XP

    4.Report XP功能完善以后可以通过下载xml格式报表文件到本地打印或者通过applet读取服务器上的报表文件直接从浏览器打印 从而解决web应用的网络报表印刷问题 5.Beta版本程序提供常用的报表线条,矩形,文本框...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形文件 JS:javascript源文件 JSP:HTML网页,其中包含有对一个Java servlet...

    Websocket-Smart-Card-Signer:基于Websocket的(无APPLET)智能卡数字签名框架

    该应用程序支持PAdES标准中的在线和本地PDF文档的签名,以及使用CAdES标准的P7M中任何其他类型的文件的签名。 此应用程序依赖于和项目的。 以下是有关这些功能的更多详细信息。 特征 基于Websocket。 没有使用过时...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    Automated-Teller-Machine:一个基于ATM Emulator GUI的Java applet

    一个基于ATM Emulator GUI的Java applet。 #具有以下功能的ATM现金交付仿真器应用程序:a)身份验证:要求用户输入个人识别码和密码。 从MySQL数据库中获取数据。 b)取款:只能以50的倍数提取现金。 如果余额少于...

    深入java虚拟机第二版

    深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 ...附录C 按操作码字节值排列的操作码助

Global site tag (gtag.js) - Google Analytics