`
rautinee
  • 浏览: 98239 次
  • 来自: 成都 四川
社区版块
存档分类
最新评论

用数字签名的applet解决客户端文件读写

阅读更多
最近有个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
分享到:
评论
4 楼 jiao_zg22 2012-04-17  
遇到相同问题,我用JavaScript读取文件,获得的值传到applet中作为二进制数组获取时报错,也就是二进制数组无法从js传到applet里面,能否解决这个问题?
3 楼 fyland 2010-05-24  
现在很少有人用applet
一般都是用flash,98%的装机率,无可比拟的优势
2 楼 ivy013 2010-05-24  
rautinee 写道
疑问:
网页中javascript不能直接调用applet中文件读写的方法setTxt,查看java控制台信息提示无权限,即使用了签名也是如此,后来只有写在paint方法里面,在javascript中用repaint来调用。有没有遇到这个问题的,你们是如何解决的,欢迎来信讨论,email:rautinee@yahoo.com.cn

//在你的Showme类中加入下面的代码就ok了,
static {
		System.setSecurityManager(null);
	}
1 楼 cuixiping 2010-01-26  
我也借鉴一下。
暂时还没遇到这种需求。
一般我都弄成导入导出的功能,让用户上传和保存有关文件。

相关推荐

    java applet 操作本地文件

    - **数字签名的实现**:通常,开发者会使用`jarsigner`工具对包含Applet的JAR文件进行签名。该工具要求提供一个密钥库(keystore),其中包含私钥和公钥对。命令行示例如下: ``` jarsigner -keystore myupload....

    孙强上传的applet的保存文件

    5. ** signed Applets**:签名的Applet拥有更多的权限,包括读写文件。签名的过程是为Applet添加数字签名,证明其来源可信赖。这样,用户在首次运行时会被提示是否信任该Applet,一旦用户选择信任,Applet就能获得...

    用applet实现自动从服务器上下载文件

    本主题关注的是如何使用Applet来实现一个自动化文件下载功能,即从服务器上下载文件到客户端,而且这个过程无需用户手动操作弹出的保存对话框。 首先,我们需要了解Applet的基本概念。Applet是Java语言编写的一种...

    applet签名过程

    2. **授权访问**:只有经过签名的Applet才能访问客户端资源(如读写本地文件)。 3. **提高安全性**:减少恶意软件的风险,保护用户的隐私和安全。 #### 三、Applet签名步骤详解 ##### 1. 生成密钥库 使用`...

    jbuilder2005开发applet游戏接触

    数字签名允许Applet在客户端执行敏感操作,如保存文件。 8. **数字签名**:为Applet进行数字签名,使用证书确保代码完整性和来源可信,以便浏览器放宽对Applet的权限限制。 9. **JRE插件制作**:如果客户端的JRE...

    大文件上传的Java Applet mupload.7z

    因此,`mupload`可能使用了数字签名来验证Applet的来源,防止恶意代码的注入。同时,Applet的权限控制也是关键,通过设置`applet.policy`文件,我们可以限制Applet对本地资源的访问,只允许其进行必要的文件读写操作...

    java+applet 聊天程序

    为了突破沙箱的限制,Applet可以被签名,这需要开发者购买并使用数字证书。签名的Applet可以获取更多的权限,但同时也要求用户确认信任该代码。 9. **现代Web技术的替代** 尽管Java Applet曾经是创建富互联网应用...

    ftp client applet

    3. **Java I/O流处理**:FTP客户端Applet需要处理文件的读写操作,这涉及到Java的I/O流。例如,使用`DataInputStream`和`DataOutputStream`进行二进制或文本数据的传输,以及`FileInputStream`和`FileOutputStream`...

    Java中Applet简介.pdf

    - 通过数字签名,Applet可以获得更多的权限,例如读写本地文件,但这需要用户明确的许可。 **Applet图形的显示和刷新**: - `paint()`方法用于实际的绘图操作,当需要在Applet上绘制内容时调用。 - `repaint()`方法...

    servlet applet通讯的例子

    因此,敏感操作如文件读写、网络访问等可能需要用户权限或使用签名的Applet。 5. **HTTP请求和响应**: - Applet通过HttpURLConnection发送请求,可以设置请求头、参数和请求体。Servlet接收到请求后,根据请求...

    AppletFTPClient

    3. **配置安全权限**:由于Applets运行在受限制的沙箱环境中,可能需要签署Applet以获取更多的系统访问权限,例如读写本地文件,这通常涉及数字签名的过程。 4. **浏览器中的执行**:用户访问包含Applet的HTML页面...

    java源码包---java 源码 大量 实例

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包2

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包3

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java源码包4

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

Global site tag (gtag.js) - Google Analytics