最近有个java的B/S项目,要求能在客户端读写文件,查了下资料,解决方案一般是写activex和applet,由于项目是跨浏览器的,所以activex不能满足要求,out了,只能用applet,要解决applet在客户端读写的问题,需要给applet数字签名,最后经过几番尝试,终于调试通过,现发出来给大家共享。
首先写applet了
package com.shiningway.applet;
import java.applet.Applet;
import java.io.*;
import java.awt.*;
import java.util.*;
public class ShowMe extends Applet{
public File f=null;
public String text="";//请注意此处的public
Date dd=null;
int n=0;
/**
* Called by the browser or applet viewer to inform
* this applet that it is being reclaimed and that it should destroy
* any resources that it has allocated. The <code>stop</code> method
* will always be called before <code>destroy</code>. <p>
*
* A subclass of <code>Applet</code> should override this method if
* it has any operation that it wants to perform before it is
* destroyed. For example, an applet with threads would use the
* <code>init</code> method to create the threads and the
* <code>destroy</code> method to kill them. <p>
*/
public void destroy() {
// Put your code here
}
public void paint(Graphics g ) {
if(text!=null && !text.equals(""))
{
setTxt(text);
}
//g.drawString(text, 40, 50);
text="";
}
public void setText(String st)
{
text=st;
}
public void init() {
f=new File("D:\\lala.txt");
if (!f.exists())
{
try
{
f.createNewFile();
}
catch(Exception ex)
{
System.out.println(ex.getMessage());
}
}
}
public void setTxt(String tt)
{
try
{
RandomAccessFile raf = new RandomAccessFile(f, "rw");
raf.seek(raf.length());
raf.writeBytes("\n"+tt);
raf.close();
}
catch (Exception ex)
{
System.out.println(ex.getMessage());
}
finally
{
}
}
public void start() {
}
/**
* Called by the browser or applet viewer to inform
* this applet that it should stop its execution. It is called when
* the Web page that contains this applet has been replaced by
* another page, and also just before the applet is to be destroyed. <p>
*
* A subclass of <code>Applet</code> should override this method if
* it has any operation that it wants to perform each time the Web
* page containing it is no longer visible. For example, an applet
* with animation might want to use the <code>start</code> method to
* resume animation, and the <code>stop</code> method to suspend the
* animation. <p>
*/
public void stop() {
// Put your code here
}
}
关于applet的数字签名,网上资料很多,自己可以去查,可以参考一下这个帖子http://www.blogjava.net/beansoft/archive/2008/05/11/199801.html
(其实这个帖子里面已经是包含了我这边的大部分内容了)
showMe.html的文件代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My applet 'ShowMe' starting page</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<script>
function setTxt()
{
document.lama.setText(document.getElementById("txtbaby").value);
document.lama.repaint();
}
</script>
<body>
<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object
classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=1,5,0,0"
WIDTH = "300" HEIGHT = "400" NAME = "lama" >
<PARAM NAME = CODE VALUE = "com.shiningway.applet.ShowMe.class" >
<PARAM NAME = ARCHIVE VALUE = "test.jar" >
<PARAM NAME = NAME VALUE = "lama" >
<PARAM NAME = MAYSCRIPT VALUE = true >
<param name = "type" value = "application/x-java-applet;version=1.5">
<param name = "scriptable" value = "false">
<comment>
<embed
type = "application/x-java-applet;version=1.5" \
CODE = "com.shiningway.applet.ShowMe.class" \
ARCHIVE = "test.jar" \
NAME = "lama" \
WIDTH = "300" \
HEIGHT = "400" \
MAYSCRIPT = true
scriptable = false
pluginspage = "http://java.sun.com/products/plugin/index.html#download">
<noembed>
</noembed>
</embed>
</comment>
</object>
<!--
<APPLET CODE = "com.shiningway.applet.ShowMe.class" ARCHIVE = "test.jar" WIDTH = "300" HEIGHT = "400" NAME = "lama" MAYSCRIPT = true>
</APPLET>
-->
<!--"END_CONVERTED_APPLET"-->
<input type="text" name="txtbaby" id="txtbaby">
<input type="button" onclick="setTxt()" value="添加内容">
</body>
</html>
这个例子的效果是在showMe.html中的输入框中输入内容,然后点击添加内容按钮,改内容回自动保存在客户端D盘的lala.txt文件中
总结一下,知识点主要是以下几点
- applet编程
- applet数字签名
- java文本文件的读写操作
- javascript如何与applet通信
疑问:
网页中javascript不能直接调用applet中文件读写的方法setTxt,查看java控制台信息提示无权限,即使用了签名也是如此,后来只有写在paint方法里面,在javascript中用repaint来调用。有没有遇到这个问题的,你们是如何解决的,欢迎来信讨论,email:rautinee@yahoo.com.cn
分享到:
相关推荐
- **数字签名的实现**:通常,开发者会使用`jarsigner`工具对包含Applet的JAR文件进行签名。该工具要求提供一个密钥库(keystore),其中包含私钥和公钥对。命令行示例如下: ``` jarsigner -keystore myupload....
5. ** signed Applets**:签名的Applet拥有更多的权限,包括读写文件。签名的过程是为Applet添加数字签名,证明其来源可信赖。这样,用户在首次运行时会被提示是否信任该Applet,一旦用户选择信任,Applet就能获得...
本主题关注的是如何使用Applet来实现一个自动化文件下载功能,即从服务器上下载文件到客户端,而且这个过程无需用户手动操作弹出的保存对话框。 首先,我们需要了解Applet的基本概念。Applet是Java语言编写的一种...
2. **授权访问**:只有经过签名的Applet才能访问客户端资源(如读写本地文件)。 3. **提高安全性**:减少恶意软件的风险,保护用户的隐私和安全。 #### 三、Applet签名步骤详解 ##### 1. 生成密钥库 使用`...
数字签名允许Applet在客户端执行敏感操作,如保存文件。 8. **数字签名**:为Applet进行数字签名,使用证书确保代码完整性和来源可信,以便浏览器放宽对Applet的权限限制。 9. **JRE插件制作**:如果客户端的JRE...
因此,`mupload`可能使用了数字签名来验证Applet的来源,防止恶意代码的注入。同时,Applet的权限控制也是关键,通过设置`applet.policy`文件,我们可以限制Applet对本地资源的访问,只允许其进行必要的文件读写操作...
为了突破沙箱的限制,Applet可以被签名,这需要开发者购买并使用数字证书。签名的Applet可以获取更多的权限,但同时也要求用户确认信任该代码。 9. **现代Web技术的替代** 尽管Java Applet曾经是创建富互联网应用...
3. **Java I/O流处理**:FTP客户端Applet需要处理文件的读写操作,这涉及到Java的I/O流。例如,使用`DataInputStream`和`DataOutputStream`进行二进制或文本数据的传输,以及`FileInputStream`和`FileOutputStream`...
- 通过数字签名,Applet可以获得更多的权限,例如读写本地文件,但这需要用户明确的许可。 **Applet图形的显示和刷新**: - `paint()`方法用于实际的绘图操作,当需要在Applet上绘制内容时调用。 - `repaint()`方法...
因此,敏感操作如文件读写、网络访问等可能需要用户权限或使用签名的Applet。 5. **HTTP请求和响应**: - Applet通过HttpURLConnection发送请求,可以设置请求头、参数和请求体。Servlet接收到请求后,根据请求...
3. **配置安全权限**:由于Applets运行在受限制的沙箱环境中,可能需要签署Applet以获取更多的系统访问权限,例如读写本地文件,这通常涉及数字签名的过程。 4. **浏览器中的执行**:用户访问包含Applet的HTML页面...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...
关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...