MyEclipse6Java开发中文教程 首先我们用 Eclipse来运行,当然没问题,因为模拟器为了调试方便,是运行所有的操作 的,运行后,界面显示文件写入成功,并且在C盘根目录下可以找到文件 test. txt,并看到 文件内容。随后我们创建HTML文件,打算在网页文件中运行它,文件代码清单如下 FileOperationApplet. html <applet code=applets. FileOperationApplet class width="200"height=200"> </html> ,接着用浏览器打开这个网页,可以看到如图186所示的出错界面和信息提示。这个出错 信息完整的内容是: javasecurity AccessControlException: access denied (ava. o FilePermission c: test. txt at java security AccessControlContext checkPermission (Unknown Source at java security Access Controller. checkPermission(Unknown Source) at java. lang SecurityManager checkPermission(Unknown Source at java lang SecurityManager checkWrite(Unknown Source at java. io File OutputStream. <init(Unknown Source) at java. o File Output Stream. <init(Unknown Source, at java. io FileWriter. <init(Unk/ at applets. FileOperationApplet start(FileOperationApplet java: 10) at sun plugin. applet Plugin 2ManagerSAppletExecution Runnable run(Unknown at java. lang Thread run(Unknown Source) 即:访问拒绝,不能写入文件 c: test. txt.这很安全,不是吗? ☆收藏夹8 E: \workspace AppletTest\bin FileOperation ①错误。请单击以获取洋细信息圈Jaa控制台 Applet Status:小程序已载入 Applet Status: Applet resized and added to parent c Applet Status: Applet initialized Applet Status: Applet made visible Applet Status: Starting applet java security AccessControlException: access denie at java security AccessController, checkP at java. lang SecurityManager, checkPermissior at java. lang. SecurityMlanager, checkWrite Unk 图186 Applet安全限制错误 然而实话实说, Applet在企业内部网上,还是很有用处的,它一般可以用来做一些复 刘长炯著
MyEclipse 6 Java 开发中文教程 16 刘长炯著 } } 。首先我们用 Eclipse 来运行,当然没问题,因为模拟器为了调试方便,是运行所有的操作 的,运行后,界面显示文件写入成功,并且在 C 盘根目录下可以找到文件 test.txt,并看到 文件内容。随后我们创建 HTML 文件,打算在网页文件中运行它,文件代码清单如下: FileOperationApplet.html <html> <body> <applet code=applets.FileOperationApplet.class width="200" height="200" > </applet> </body> </html> ,接着用浏览器打开这个网页,可以看到如图 18.6 所示的出错界面和信息提示。这个出错 信息完整的内容是: java.security.AccessControlException: access denied (java.io.FilePermission c:\test.txt write) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkWrite(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at java.io.FileWriter.<init>(Unknown Source) at applets.FileOperationApplet.start(FileOperationApplet.java:10) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source) ,即:访问拒绝,不能写入文件 c:\test.txt。这很安全,不是吗? 图 18.6 Applet 安全限制错误 然而实话实说,Applet 在企业内部网上,还是很有用处的,它一般可以用来做一些复
MyEclipse6Java开发中文教程 杂的操作,或者是大文件的上传下载,即时消息支持等等,笔者见过不少这样的解决方案(网 络上也有人制作了 Applet批量文件上传的功能)。不过,这样的限制,虽然是安全了,但是 却让 Applet的功能大打折扣,那么有没有办法绕过这层安全限制呢?答案是肯定的,这就 是Java中推出的签名JAR功能,可以帮助我们在用户同意的情况下,绕过安全限制(当然 在内部网没有问题,如果是外网,很容易发生恶意代码,例如恶意删除文件等等)。 注意:由于 Microsoft也推出了一款JM,导致了Java标准的分裂,微软格式的数字 签名 applet打包格式为cab,签名方式也和我们下面描述的内容不同,有兴趣的读者可以 去査找相关资料,总之是不通用的。 如果是正规的公司,数字证书都是需要购买的,像 Verisign之类的公司,提供这样的 服务,它的好处就是确保证书是全球唯一的,能够在出现事故时,鉴定是否是有效的数字证 书,其实就类似于一份全球唯一的身份证,带有你自己才知道的密码,缺点就是不免费。大 家如果在线安装过软件,一般大公司的插件,例如 Flash播放器等等,都会带有数字证书。 当然,在Java中,不需要这么麻烦,JDK已经提供了一个工具 keytool.exe来让开发人员 自己生成数字证书(至于安全,加密方面的话题,那就太繁杂了,读者可以自己去查找资料)。 如果不想使用命令行版本的这个工具,还可以下载一个开源的软件 Key Tool GU,详见参考 资料一节的内容。下面我们就快速进入主题,首先启动cMD命令行工具,然后进入到当前 的项目目录,运行下面的命令: keytool -genkey -dname cn=Bean Soft Studio, ouJava Software, o=Bean Soft Studio, C=China" -alias beansoft -keypass beansoft -storepass beansoft -validity 365 -keystore. beansoft 这段命令将会创建一个数字文件放在当前目录的二进制文件 beansoft中。该证书的别名是 beansoft(通过- alias指定),密钥的密码是 beansoft(- keypass命令指定),存储密钥的文 件密码也是 beansoft(- storepass命令指定),证书的有效期是365天(通过 validity指定), 并把它存储到密码文件 beansoft中。这段命令执行后,没有出错信息的话即是创建成功 另外,如果是实际的项目的话,最好将两个密码设置成安全级别比较高的密码。除了这样来 生成一个密钥文件外,还可以用 Key Tool以交互的方式来生成(比较推荐初学者使用这种 方式) 随后,会提示您输入必须或者可选的内容。 随后我们可以检查下这份证书文件的内容,执行下面的命令: keytool-list-keystore. beansoft-storepass beansoft 会输出信息: Keystore类型:JKS Keystore提供者:SUN 您的 keystore包含1输入 beansoft, 2008-5-7, PrivateKeyEntry 认证指纹(MD5):16:15:A047:92:962996:93:50F0:76:F7:D02C84 。这说明证书没有问题 有时可能需要导出证书供人使用,可以执行下面的命令: keytool-export-keystore. beansoft-storepass beansoft-file beansoft cer-alias beansoft 随后会生成一个 beansoft. cer,不过在这里对 Applet签名是不需要这样做的,只有在做SSL 开发时,才能用得到它。 刘长炯著
MyEclipse 6 Java 开发中文教程 17 刘长炯著 杂的操作,或者是大文件的上传下载,即时消息支持等等,笔者见过不少这样的解决方案(网 络上也有人制作了 Applet 批量文件上传的功能)。不过,这样的限制,虽然是安全了,但是 却让 Applet 的功能大打折扣,那么有没有办法绕过这层安全限制呢?答案是肯定的,这就 是 Java 中推出的签名 JAR 功能,可以帮助我们在用户同意的情况下,绕过安全限制(当然 在内部网没有问题,如果是外网,很容易发生恶意代码,例如恶意删除文件等等)。 注意:由于 Microsoft 也推出了一款 JVM,导致了 Java 标准的分裂,微软格式的数字 签名 applet 打包格式为 cab,签名方式也和我们下面描述的内容不同,有兴趣的读者可以 去查找相关资料,总之是不通用的。 如果是正规的公司,数字证书都是需要购买的,像 Verisign 之类的公司,提供这样的 服务,它的好处就是确保证书是全球唯一的,能够在出现事故时,鉴定是否是有效的数字证 书,其实就类似于一份全球唯一的身份证,带有你自己才知道的密码,缺点就是不免费。大 家如果在线安装过软件,一般大公司的插件,例如 Flash 播放器等等,都会带有数字证书。 当然,在 Java 中,不需要这么麻烦,JDK 已经提供了一个工具 keytool.exe 来让开发人员 自己生成数字证书(至于安全,加密方面的话题,那就太繁杂了,读者可以自己去查找资料)。 如果不想使用命令行版本的这个工具,还可以下载一个开源的软件 KeyTool GUI,详见参考 资料一节的内容。下面我们就快速进入主题,首先启动 CMD 命令行工具,然后进入到当前 的项目目录,运行下面的命令: keytool -genkey -dname "cn=BeanSoft Studio, ou=Java Software, o=BeanSoft Studio, c=China" -alias beansoft -keypass beansoft -storepass beansoft -validity 365 -keystore .\beansoft 这段命令将会创建一个数字文件放在当前目录的二进制文件 beansoft 中。该证书的别名是 beansoft(通过-alias 指定),密钥的密码是 beansoft(-keypass 命令指定),存储密钥的文 件密码也是 beansoft(- storepass 命令指定),证书的有效期是 365 天(通过-validity 指定), 并把它存储到密码文件 beansoft 中。这段命令执行后,没有出错信息的话即是创建成功。 另外,如果是实际的项目的话,最好将两个密码设置成安全级别比较高的密码。除了这样来 生成一个密钥文件外,还可以用 KeyTool 以交互的方式来生成(比较推荐初学者使用这种 方式): keytool –genkey 随后,会提示您输入必须或者可选的内容。 随后我们可以检查下这份证书文件的内容,执行下面的命令: keytool -list -keystore .\beansoft -storepass beansoft 会输出信息: Keystore 类型: JKS Keystore 提供者: SUN 您的 keystore 包含 1 输入 beansoft, 2008-5-7, PrivateKeyEntry, 认证指纹 (MD5): 16:15:A0:47:92:96:29:96:93:5D:F0:76:F7:D0:2C:84 。这说明证书没有问题。 有时可能需要导出证书供人使用,可以执行下面的命令: keytool -export -keystore .\beansoft -storepass beansoft -file beansoft.cer -alias beansoft 随后会生成一个 beansoft.cer,不过在这里对 Applet 签名是不需要这样做的,只有在做 SSL 开发时,才能用得到它
MyEclipse6Java开发中文教程 随后,请读者按照16.131JAR文件一节所介绍的内容,将 Applet的类文件打包成jar 文件,名为 applets. jar,放在项目的根目录下。接着就进入最关键的,对JAR文件进行签 名了,键入下列命令: jarsigner-verbose-keystore. beansoft applets jar beansoft 接着提示信息为: 输入密钥库的口令短语: beansoft按下回车,即可看到签名过程: 正在添加: META-INFIMANIFESTMF 正在添加: META-INFIBEANSOFTSF 正在添加: META-INF/BEANSOFTDSA 正在添加: applets 正在签名: applets/ FileOperationApplet class 正在签名; applets/ ife CycleApplet class 正在签名; applets/MyApplet class 在签名: applets/usb jpg 可以看到 META-INF目录下将会多出两个数字指纹文件,运行的时候JVM将会和类文件进 行对比,确保文件没被人篡改过 好了,现在的 applets. jar已经今非昔比了,它是个被签名过的JAR,怎么使用它呢 需要在它所在的同一目录下,即项目根目录下,新建一个HTML文件,代码清单如下: FileOperationAppletsigned. html <html> <applet code=applets. File OperationApplet class archive="applets. jar" width="200" height="200”> </html> 唯一的不同,就是多了粗斜体的 archive=" applets. jar”这句话。 好了,最激动人心的时刻到来了,请用浏览器打开这个网页,会看到一个安全提示,如 图187所示。点击运行按钮,即可看到正确的执行了操作,在用户的C盘上创建了一个文 件!很好,我们可以为所欲为了,像写普通Java应用那样来写 Applet了!如果点击取消按 钮,那很自然的无法创建文件,用户拥有选择权,当然,如果是企业的客户,自然都是让他 们选择运行按钮。其实通过这里读者也可以注意到,现在好多网站(例如视频分享的网站等), 都会提示您下载一些插件提供增强的功能,然而,他们的数字证书和这里的一样,都是自己 造的其实就是伪造),所以,装完后并不能保证是否夹杂了病毒或者恶意代码,所以读者 上网时千万要谨慎识别,不要随意点击在线安装或者运行软件。 刘长炯著
MyEclipse 6 Java 开发中文教程 18 刘长炯著 随后,请读者按照 16.1.3.1 JAR 文件一节所介绍的内容,将 Applet 的类文件打包成 jar 文件,名为 applets.jar,放在项目的根目录下。接着就进入最关键的,对 JAR 文件进行签 名了,键入下列命令: jarsigner -verbose -keystore .\beansoft applets.jar beansoft 接着提示信息为: 输入密钥库的口令短语:beansoft 按下回车,即可看到签名过程: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/BEANSOFT.SF 正在添加: META-INF/BEANSOFT.DSA 正在添加: applets/ 正在签名: applets/FileOperationApplet.class 正在签名: applets/LifeCycleApplet.class 正在签名: applets/MyApplet.class 正在签名: applets/usb.jpg 可以看到 META-INF 目录下将会多出两个数字指纹文件,运行的时候 JVM 将会和类文件进 行对比,确保文件没被人篡改过。 好了,现在的 applets.jar 已经今非昔比了,它是个被签名过的 JAR,怎么使用它呢? 需要在它所在的同一目录下,即项目根目录下,新建一个 HTML 文件,代码清单如下: FileOperationAppletSigned.html <html> <body> <applet code=applets.FileOperationApplet.class archive="applets.jar" width="200" height="200" > </applet> </body> </html> 唯一的不同,就是多了粗斜体的 archive="applets.jar"这句话。 好了,最激动人心的时刻到来了,请用浏览器打开这个网页,会看到一个安全提示,如 图 18.7 所示。点击运行按钮,即可看到正确的执行了操作,在用户的 C 盘上创建了一个文 件!很好,我们可以为所欲为了,像写普通 Java 应用那样来写 Applet 了!如果点击取消按 钮,那很自然的无法创建文件,用户拥有选择权,当然,如果是企业的客户,自然都是让他 们选择运行按钮。其实通过这里读者也可以注意到,现在好多网站(例如视频分享的网站等), 都会提示您下载一些插件提供增强的功能,然而,他们的数字证书和这里的一样,都是自己 造的(其实就是伪造),所以,装完后并不能保证是否夹杂了病毒或者恶意代码,所以读者 上网时千万要谨慎识别,不要随意点击在线安装或者运行软件
MyEclipse6Java开发中文教程 答告-安全 该应用程序的数字签名无法验证。是否要运行该应用程 序? 名称: 发行者: Beansoft studi 从: file: / □始终信任此发行者的内容④A) 运行 取消 该数字签名无法被验证为来自可信来源。只有在您信任应用程序 来源的悄况下才能迳行 更多信息(0 187 Applet数字签名安全提示 OK,罗罗嗦嗦的讲了这么老半天,就是希望给那些使用 Applet的用户提供一个相对完 整的实践方案,也许现在能在项目中用到AWT, Swing的地方,也就剩下 Applet了。接下 来讨论在网页中使用 Applet的进一步功能:参数传递和调用 JavaScript 182.5 Applet参数传递和 JavaScript互操作 Applet在浏览器中并不是孤零零的一个Java类绘制的孤岛小方块,相反的,它可以和 页面发生交互。可以从 Applet调用 JavaScript(仅限 JavaScript),也可反过来从 JavaScript 中调用 Applet中公开的方法。其实Java早期和 Netscape浏览器结合的很紧,后来 Netscape 变成了 Mozilla和 Firefox,那么有多紧呢? Mozilla系列的浏览器支持直接使用Java类作为 脚本对象。另外,还可以通过<paam>标记给 Applet传递一些初始化的参数,这样 Applet 就成为了可定制的插件了。下面我们通过例子来说明。 第一个小例子,是有一个做好的秒表( StopWatch)程序,通过计时器来显示精确到忽 秒(1忽秒=0.1秒)的模拟液晶时显示(通过换图实现的),这些数字图片还有上午 am. gif), 下午( pm. gif),数字点( point. gif,可以完整的模拟常见的液晶显示的时间,不过在这里我们 实现的是一个秒表,这些内容如图188所示。当然,如果用 JavaScript来实现秒表,会更 方便一些,不过在这里我们就不讨论那方面的内容了,从网络搜索“ JavaScript液晶时间”, 可以得到很多答案。回归正题,在这个例子中我们的主要目的是配置两个参数,一个是背景 色,一个是前景色,这两个参数可以影响 Applet显示时候的外观 刘长炯著
MyEclipse 6 Java 开发中文教程 19 刘长炯著 18.7 Applet 数字签名安全提示 OK,罗罗嗦嗦的讲了这么老半天,就是希望给那些使用 Applet 的用户提供一个相对完 整的实践方案,也许现在能在项目中用到 AWT,Swing 的地方,也就剩下 Applet 了。接下 来讨论在网页中使用 Applet 的进一步功能:参数传递和调用 JavaScript。 18.2.5 Applet 参数传递和 JavaScript 互操作 Applet 在浏览器中并不是孤零零的一个 Java 类绘制的孤岛小方块,相反的,它可以和 页面发生交互。可以从 Applet 调用 JavaScript(仅限 JavaScript),也可反过来从 JavaScript 中调用 Applet 中公开的方法。其实 Java 早期和 Netscape 浏览器结合的很紧,后来 Netscape 变成了 Mozilla 和 Firefox,那么有多紧呢?Mozilla 系列的浏览器支持直接使用 Java 类作为 脚本对象。另外,还可以通过<param>标记给 Applet 传递一些初始化的参数,这样 Applet 就成为了可定制的插件了。下面我们通过例子来说明。 第一个小例子,是有一个做好的秒表(StopWatch)程序,通过计时器来显示精确到忽 秒(1 忽秒=0.1 秒)的模拟液晶时显示(通过换图实现的),这些数字图片还有上午(am.gif), 下午(pm.gif),数字点(point.gif),可以完整的模拟常见的液晶显示的时间,不过在这里我们 实现的是一个秒表,这些内容如图 18.8 所示。当然,如果用 JavaScript 来实现秒表,会更 方便一些,不过在这里我们就不讨论那方面的内容了,从网络搜索“JavaScript 液晶时间”, 可以得到很多答案。回归正题,在这个例子中我们的主要目的是配置两个参数,一个是背景 色,一个是前景色,这两个参数可以影响 Applet 显示时候的外观
MyEclipse6Java开发中文教程 E:\workspace\Applet Test\srcllib 囡国区 16x21x4 16x21x4 16x21x4 6x21x4 16x21x4 0.gif「1.gif「2.gif「3.aif「4.aif 区区酬 16x21x4 16x21x4 16x21x4 16x21x4 16x21x4 16x21x4 5. gif 6. gif 16x21x49x21x416x16x1616x16ax1616x16x16 pm. gif point. gif reset. gif start. gif stop. gif B:B:日: 图188秒表 Applet用到的图片列表和秒表效果 接下来,先让我们看例子运行时候的HTML文件和显示效果,网页文件代码清单如下 所示: src/StopWatchApplet html 无参数: <applet code=applets. StopWatchApplet class width=200"height="200> </applet> 有参数 <applet code=applets. StopWatchApplet class width= 200"height="200> <param name=bg"value="0X00if00><param> <param name="ig"value="Oxfif0000"><param> /html> 在这个页面,我们配置了两个 Applet,左侧的是不带参数的,右侧的是带参数的。通过粗 斜体的 param标记,我们可以给 Applet加入参数,name指定了参数名,vaue给出了参数 值,这样在 Applet中通过 getParameter( String参数幻这种方式来获取到取值了。例如上 面的两个参数,调用 getParameter(bg可以得到值为字符串0x0Of0O,也就是绿色的颜色 编码,最后会作为背景的颜色来显示:而fg则是前景色,取值为0xf000,表示红色。如 果没设置参数,自然 getParameter0得到的值就是nu字符串了。接下来让我们先看下运行 效果,如图189所示。一个是没配置参数,黑底绿字;一个是带参数的,绿底红字 刘长炯著
MyEclipse 6 Java 开发中文教程 20 刘长炯著 图 18.8 秒表 Applet 用到的图片列表和秒表效果 接下来,先让我们看例子运行时候的 HTML 文件和显示效果,网页文件代码清单如下 所示: src/StopWatchApplet.html <html> <body> 无参数: <applet code=applets.StopWatchApplet.class width="200" height="200" > </applet> 有参数: <applet code=applets.StopWatchApplet.class width="200" height="200" > <param name="bg" value="0x00ff00"></param> <param name="fg" value="0xff0000"></param> </applet> </body> </html> 在这个页面,我们配置了两个 Applet,左侧的是不带参数的,右侧的是带参数的。通过粗 斜体的 param 标记,我们可以给 Applet 加入参数,name 指定了参数名,value 给出了参数 值,这样在 Applet 中通过 getParameter(String 参数名)这种方式来获取到取值了。例如上 面的两个参数,调用 getParameter(“bg”)可以得到值为字符串 0x00ff00,也就是绿色的颜色 编码,最后会作为背景的颜色来显示;而 fg 则是前景色,取值为 0xff0000,表示红色。如 果没设置参数,自然 getParameter()得到的值就是 null 字符串了。接下来让我们先看下运行 效果,如图 18.9 所示。一个是没配置参数,黑底绿字;一个是带参数的,绿底红字