applet操作本地文件
?????? 最近開發(fā),遇到一問題,需要用applet來操作本地文件,在網(wǎng)上查了很多資料,研究了三天終于搞定了。做個(gè)總結(jié),以便遇
到相同問題的朋友可以做個(gè)參考。
????? 正常來說applet是不能操作本地文件的,這是書上說的,其實(shí)這也就是java的安全策略,? Java應(yīng)用程序環(huán)境的安全策略,詳
細(xì)說明了對(duì)于不同的代碼所擁有的不同資源的許可,它由一個(gè)Policy對(duì)象來表達(dá),Policy是什么?呵呵,一會(huì)再說,先別急。那么
applet的安全策略就包括不能對(duì)本地文件的讀和寫。但我們可以自已來改變java的安全策略,這里也就是來改變applet的安全策略,
那么我們用什么來改變java的安全策略呢,這就需要對(duì)jre的中配置文件來進(jìn)行修改,這個(gè)文件就是 jre目錄下的
lib/security/java.security,?? 我們可以自已來創(chuàng)建一個(gè)安全策略文件,也是就一個(gè)擴(kuò)展名為.policy的文件,在里面我們可以來
寫我們自已定義的安全策略,在java.security中,來引用這個(gè)文件就行了。policy文件具體怎么來寫?java.security中怎么來引用
?下面我會(huì)有具體的描述。
????? 以上說了這個(gè)多,不得不提的一個(gè)東西就是java的數(shù)字簽名,在網(wǎng)上找了下數(shù)字簽名的概念。
????? 數(shù)字簽名:采用加密技術(shù)來實(shí)現(xiàn)對(duì)簽名者身份的認(rèn)證和數(shù)據(jù)的完整性。簡(jiǎn)單的說就是你簽字的文件別人知道是你簽的,并且知
道這個(gè)文件是否被修改過。
???? 我們可以通過 數(shù)字簽名 applet的jar文檔來實(shí)現(xiàn)控制的策略。
?
???? 好了,以上都是理論,我們來實(shí)際的說下步驟,做個(gè)例子。
?
1 我們先下寫個(gè)applet,功能是讀本地的一個(gè)文件。
?
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>標(biāo)簽轉(zhuǎn)成<object>標(biāo)簽,用<object>的好處是,如果客戶的機(jī)器中沒有jre,那么applet是運(yùn)行不了的,用的
<object>標(biāo)簽后,可以自動(dòng)下載jre安裝到客戶端,我感覺這個(gè)功能非常好。
?
?可通過HtmlConverter來轉(zhuǎn)。
?HtmlConverter工具位于${java_home}/bin下
?
?在doc下進(jìn)入html頁面的相應(yīng)目錄, 輸入
?? HtmlConverter test.html;
?這樣就完成的轉(zhuǎn)換
?轉(zhuǎn)換后的頁面變?yōu)?/p>
? <!--"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"-->
?
完成這個(gè)步驟后,這個(gè)Applet已經(jīng)可以顯示了。但是還不能讀寫本地的文件系統(tǒng)
?
4 使用keytool工具生成密匙庫(kù)
keytool工具位于${java_home}/bin目錄下
在DOS窗口中執(zhí)行命令:keytool -genkey -keystore mytest.store -alias fhx
注意:mytest.store 是你的密匙庫(kù)的名稱,可以隨意修改,后綴請(qǐng)不要修改!
??????????? fhx為別名,這個(gè)也可以改成自己的名稱
執(zhí)行上述命令后,DOS窗口中會(huì)提示你輸入keystore的密碼、你的姓名、組織單位等等信息。這里要注意的是輸入密碼請(qǐng)記住,后面
要用到的。在最后,我們輸入y確認(rèn)信息。然后再直接回車設(shè)置fhx的主密碼和store密碼一致即可!
?
5 使用keytool工具導(dǎo)出簽名時(shí)用到的證書
在DOS窗口中執(zhí)行命令:keytool -export -keystore mytest.store -alias fhx -file fhx.cert
注意:mytest.store 就是第4步生成的密匙庫(kù)名稱
??????????? fhx 也是在第4步中我們指定的別名
??????????? fhx.cert 為我們生成的證書的名稱,可以自己修改名稱,注意后綴不要改
?
命令執(zhí)行成功,我們會(huì)在當(dāng)前目錄下找到一個(gè)fhx.cert文件,這個(gè)就是我們剛才生成的證書。
6 使用jarsigner工具簽名jar壓縮文檔
jarsigner工具位于${java_home}/bin目錄下;
在當(dāng)前DOS窗口中執(zhí)行命令:jarsigner -keystore mytest.store MyApplet.jar fhx
注意:mytest.store 就是我們?cè)诘?步中生成的密匙庫(kù)名稱
??????????? MyApplet.jar 就是我們這第2步壓縮的jar文檔
??????????? fhx 是提供者的名稱,我們這里設(shè)置為我們的別名
?
7 創(chuàng)建訪問策略文件mytest.policy文件
在當(dāng)前目錄下創(chuàng)建一個(gè)mytest.policy文件,其內(nèi)容如下
?
keystore "file:c: /test/mytest.store", "JKS";
grant signedBy "fhx"
{ permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";
};
這個(gè)文件的意思就是說讓所有由fhx簽名的applet都可以對(duì)本地的所有文件進(jìn)行讀,寫,刪除的操作
?
修改${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
完成這個(gè)修改后我們?cè)谇懊鎰?chuàng)建的applet.policy文件才有效。
?
如果你要考慮在Internet上實(shí)現(xiàn)這個(gè)Applet,那么你也不需要在所有的客戶端均做上面的步驟,你只需要在你的服務(wù)器上創(chuàng)建一個(gè)目
錄,例如c:/test,將這個(gè)目錄映射為www.testApplet.com/admin。這里的www.testApplet.com是一個(gè)假定的網(wǎng)址,將mytest.cert、
mytest.store、test.html、MyApplet.jar以及mytest.policy放在這個(gè)目錄中,然后修改test.policy文件如下
?
keystore "http:// www.testApplet.com/test/mytest.store", "JKS";
grant signedBy "fhx"
{ permission java.io.FilePermission "<<ALL FILES>>", "read";
};
而每個(gè)客戶端僅僅需要修改一下它們的${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
?
?
好了,現(xiàn)在你可以運(yùn)行一下test.html看看效果了,在文本框中輸入你的本地文件位置,然后點(diǎn)擊 open File按鈕,在下面的文件框
中就會(huì)讀出你的文件內(nèi)容。
?
下面還有段程序是讀一個(gè)文件內(nèi)容到另一個(gè)文件中,讀寫的功能都有了,你可以試下
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");
? }
?}
}
?
?
//
?
還有一個(gè)最簡(jiǎn)單的辦法,修改jre的安全策略文件java.policy, 它在Java/jre1.5.0/lib/security這個(gè)目錄下面,打開java.policy文件后增加下面兩句就行了
permission java.io.FilePermission "<<ALL FILES>>", "read, write, delete, execute";
permission java.security.AllPermission;
?
總結(jié)
以上是生活随笔為你收集整理的applet操作本地文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进入公司前与Boss的会谈话
- 下一篇: 整理javascript操作文件说明:读