Java Web Start 是一个helper应用程序,它和WEB浏览器关联在一起。当用户点击指向一个特定的launch文件(JNLP文件)时,会促使浏览器装载Java Web Start, JAWS然后自动下载、缓冲、运行给定的基于JAVA技术的应用程序。整个过程无需和用户进行交互。
JNLP URLs也可以从JAWS应用程序管理直接打开并且能制成书签,此外,它们也可以是.html或者.jnlp文件。
从技术的观点来看,JAWS有许多关键的好处使得它在部署应用程序方面成为一个有吸引的平台:
ØJAWS专用于装入运行基于Java 2 SE平台编写的应用程序。因此,应用程序可以置于WEB SERVER中且能被部署在各种平台中包括WINDOWS系列、Linux、Unix等。
ØJAWS支持J2SE的不同版本,因此,应用程序可以请求它所需要的特定版本。比如J2SE1.4.0.几个基于不同J2SE版本的应用程序能同时运行而不会造成冲突。并且在客户端操作系统未安装应用程序所需的J2SE版本时,JAWS能自动下载且安装它。
ØJAWS允许应用不依赖于WEB浏览器进行装载和运行。应用程序也可以通过桌面快捷方式启动运行。
ØJAWS充分利用了平台内置的安全特性。应用程序默认情况下是运行在沙袋中,限制对本地磁盘以及网络资源进行访问.它允许用户安全的运行来自不受信任的源头的应用程序。
Ø用JAWS装载运行的应用程序,会在本地被缓存起来,因此,运行一个已下载的应用程序和运行一个传统的安装了的应用程序是一样的。
Java Web Start所基于的技术是 Java Network Launching Protocol & API(JNLP).它目前正由Java Community Proces(JCP)进行开发。Java Web Start是JNLP规格的参考实现。JNLP技术定义了一个标准的文件格式以描述怎样通过调用JNLP文件来装载运行一个应用程序。
客户端机器需要支持JRE1.2.2及以后版本。服务器方面来说,由于应用程序能被部署在任何标准的Web Server上,所以只要求Web Server配置以支持新的MIME type.
为了在客户端运行应用程序,必须确保应用程序所需的的文件可以通过Web Server进行访问。典型的做法就是把应用程序所需的所有JAR文件以及JNLP文件放入Web Server特定的目录中,同普通的基于Html内容的部署没有什么区别,唯一需要注意的就是在Web Server中配置一个新的MIME type.
基本步骤
1.对所有以.jnlp扩展名结尾的文件,设置它的MIME type为application/x-java-jnlp-file
大多数WEB浏览器会根据从Web Server随同内容一同返回的MIME type来决定怎样对内容进行处理。Server针对JNLP文件则必须返回application/x-java-jnlp-file形式的MIME type,以便浏览器调用Java Web Start.
不同的Web Server指定MIME type的方式可能不同。比如Apache Web Server必须在.mime.types配置文件中增加如下行:application/x-java-jnlp-file JNLP
2.为应用程序创建JNLP文件,语法参见后续章节。
3.确保应用程序的JAR文件以及JNLP文件是可访问的(通过JNLP文件中列出的URLs的方式)
4.创建WEB PAGE来装载运行应用程序。见后续章节。
比如希望能从Web站点http://www.yyy.zzz 装载app.jnlp。则需要在Web Page中应包含如下链接:
<a href=http://www.yyy.zzz/app.jnlp>Launch the application</a>
在许多情况下,用户的机器上没有安装JAWS,因此,WEB 页还必须包含教本以已考虑JAWS没有安装的情况,其逻辑如下:
Ø 如果检测到JAWS安装了,则装载运行程序
Ø 如果检测到没有安装JAWS,再检测是否是再在WINDOWS上的IE运行
n 是,提供一个能自动安装JRE 的WEB页面
n 不是,提供一个下载SDK/JRE的通用下载页面。
后面有讨论相关的脚本以及自动安装的HTML。
Detecting if JAWS is installed on Netscape
<SCRIPT LANGUAGE="JavaScript"> var javawsInstalled = 0; var javaws12Installed = 0; var javaws142Installed=0; isIE = "false"; if (navigator.mimeTypes && navigator.mimeTypes.length) { x = navigator.mimeTypes['application/x-java-jnlp-file']; if (x) { javawsInstalled = 1; javaws12Installed=1; javaws142Installed=1; } }else { isIE = "true"; } </SCRIPT>
上述代码查看navigator.mimeTypes对象和navigator.mimeTypes.length变量,以决定浏览器是IE还是Netscape.对IE来说,尽管定义了navigator.mimeTypes但其长度为0;而对于Netscape来说,其长度不为0,而且,在Netscape中无法决定哪个JAWS的版本安装了。所以三个变量都设为1。
Detecting if JavaWeb Start is installed on IE, and if so, the version
<SCRIPT LANGUAGE="VBScript"> on error resume next If isIE = "true" Then If Not(IsObject(CreateObject("JavaWebStart.isInstalled"))) Then javawsInstalled = 0 Else javawsInstalled = 1 End If If Not(IsObject(CreateObject("JavaWebStart.isInstalled.2"))) Then javaws12Installed = 0 Else javaws12Installed = 1 End If If Not(IsObject(CreateObject("JavaWebStart.isInstalled.3"))) Then javaws142Installed = 0 Else javaws142Installed = 1 End If End If </SCRIPT>
上面脚本用来检测IE中安装的是哪个版本。脚本实例化一个JavaWebStart.dll中的isInstalled COM对象。这个对象决定几件事情:
l 客户端机器是否有任何的JAWS安装了
l 客户端机器是否安装了JAWS 1.2
l 客户端机器是否安装了JAWS 1.4.2
Launching the application if JAWS is Installed or providing a link for auto-install or general download page
可以编写另外的脚本用来决定是否:
l 提供一个链接给应用程序的jnlp文件(在JAWS安装了情况下)
l 初始化JRE1.4.2的自动下载,它包含了JAWS(在JAWS没有安装且用户用的是IE)
l 或者提供一个下载1.4.2 SDK/JRE的通用下载页面(JAWS没有安装且用户不是使用IE)
下面的代码处理这种场景:
<SCRIPT LANGUAGE="JavaScript"> /* Note that the logic below always launches the JNLP application *if the browser is Gecko based. This is because it is not possible *to detect MIME type application/x-java-jnlp-file on Gecko-based browsers. */ if (javawsInstalled || (navigator.userAgent.indexOf("Gecko") !=-1)) { document.write("<a href=http://www.yyy.zzz/app.jnlp>Launch the application</a>"); } else { document.write("Click "); document.write("<a href=http://dlres.java.sun.com/PluginBrowserCheck? pass=http://www.yyy.zzz/download.html& fail=http://java.sun.com/j2se/1.4.2/download.html>here</a> "); document.write("to download and install JRE 1.4.2 and the application."); } </SCRIPT>
Java.sun.com站点提供的PluginBrowserCheck程序的作用是检查客户端微软Windows平台上使用的是否是IE浏览器。如果是用IE浏览器,则把用户引向自动安装页面 http://www.yyy.zzz/download.html(下段描述怎样创建自动安装页面)。如果PluginBrowserCheck程序检测到客户WINDOWS平台上用的不是IE浏览器,则用户会被重定向到 java.sun.com站点上1.4.2 JRE通用的下载页面。
Creating an auto-install page
<HTML> <BODY> <OBJECT codebase="http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab" classid="clsid:5852F5ED-8BF4-11D4-A245-0080C6F74284" height=0 width=0> <PARAM name="app" value="http://www.MySite.com/app.jnlp"> <PARAM name="back" value="true"> <!-- Alternate HTML for browsers which cannot instantiate the object --> <A href="http://java.sun.com/j2se/1.5.0/download.html">Download Java Web Start</A> </OBJECT> </BODY> </HTML>
和Java Web Start一起,一个ActiveX控件也会被下载到客户端,这个ActiveX控件将使用新安装的Java Web Start装载启动应用程序。PARAM标签指明了应用程序jnlp的位置,以便在JRE安装完成之后,可以被自动装载运行。
JRE 版本 |
.cab File for codebase attribute for Autodownload |
1.4.0 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_0-win.cab |
1.4.0_01 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_0_01-win.cab |
1.4.0_02 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_0_02-win.cab |
1.4.0_03 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_0_03-win.cab |
1.4.0_04 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_0_04-win.cab |
1.4.1 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_1-windows-i586.cab |
1.4.1_01 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_1_01-windows-i586.cab |
1.4.1_02 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_1_02-windows-i586.cab |
1.4.1_03 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_1_03-windows-i586.cab |
1.4.2 |
http://java.sun.com/products/plugin/autodl/jinstall-1_4_2-windows-i586.cab |
1.4.2_01 |
http://java.sun.com/update/1.4.2/jinstall-1_4_2_01-windows-i586.cab |
1.4.2_02 |
http://java.sun.com/update/1.4.2/jinstall-1_4_2_02-windows-i586.cab |
1.4.2_03 |
http://java.sun.com/update/1.4.2/jinstall-1_4_2_03-windows-i586.cab |
1.5.0 |
http://java.sun.com/update/1.5.0/jinstall-1_5_0-windows-i586.cab |
1.5.0_01 |
http://java.sun.com/update/1.5.0/jinstall-1_5_0_01-windows-i586.cab |
1.5.0_02 |
http://java.sun.com/update/1.5.0/jinstall-1_5_0_02-windows-i586.cab |
1.5.0_03 |
http://java.sun.com/update/1.5.0/jinstall-1_5_0_03-windows-i586.cab |
开发基于Java Web Start部署技术的应用程序和普通的应用程序几乎没有什么差别,入口依然是
public static void main(String[] argv).然而,为支持WEB部署-自动下载且启动应用程序-且确保应用程序能在安全的沙袋中运行,有几个额外需要考虑的地方:
1. 应用程序必须由一系列JAR文件组成。
2. 应用程序的所有资源,比如文件以及图像必须打包成JAR文件。而且他们必须使用getResource(。。。)方法来进行引用。
3. 如果所写的应用程序在安全的沙袋里面运行,必须遵循下面的约束:
a) 不能访问本地磁盘
b) 所有JAR文件必须从同一台主机上下载
c) 只允许建立到所下载的JAR文件所在的主机的网络连接
d) 不能安装安全管理器
e) 不能使用本地库(native libraries)
f) 只能访问部分系统属性(system properties),应用程序有权读写JNLP文件中定义的所有系统属性。有权读Applet能访问(access)的属性。
g) 应用程序允许调用System.exit
h) 如果希望应用程序能无限制的访问系统资源,就必须对JAR进行签名。每个JAR文件里面的所有项都必须签名。
Ø Retrieving Resources from JAR files
Java Web Start 仅从Web Server上传输JAR文件到客户端机器上,JAWS来决定把JAR文件在本地机器上的存储位置。因此,应用程序无法使用与本地磁盘相关的路径来访问资源,比如图像或者配置文件。
所用应用的资源必须从JAR文件中获取,它们在JNLP文件中由resource段进行描述指定,或者也可以显示地使用一个到Web Server 的HTTP request来获取。但建议还是把资源存储在JAR文件中,因为会被缓存在本地机器上。
ClassLoader cl = this.getClass().getClassLoader();
Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif"));
假定JAR文件中存在项目images/save.gif和images/cut.gif
Ø Security and Code Signing
1. 保护用户免受恶意代码影响本地文件
2. 保护企业免使代码尝试访问或者破坏网络上的数据。
如果应用程序的JAR经过了签名,那么,在JNLP文件中包含如下脚本,就可以允许应用程序任意访问客户系统了。
<security>
<all-permissions/>
</security>
Java 2 SE JRE 1.4.2 支持SHA1withDSA and MD5withRSA 算法进行代码签名。Java 2 SE JRE 1.4.2提供了的标准工具 jarsigner用来进行代码签名以及创建证书。
用一个测试用的证书来签名JAR 文件的步骤如下:
1. 确认有keytool和jarsigner工具(在JDK的bin目录下)
2. 在keystore里创建一个新的key
keytool -genkey –keystore myKeystore –alias myself
工具会提示输入一些关于key的一些其它信息,比如密码和名称等。这个命令将在磁盘上创建myKeystore文件。
3.创建一个自签名的用来测试用的证书:
keytool -selfcert -alias myself -keystore myKeystore
会提示你输入建立key时输入的密码。
4. 检查是否正确:
keytool -list -keystore myKeystore
显示如下信息:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
myself, Tue Jan 23 19:29:32 PST 2001, keyEntry,
Certificate fingerprint (MD5):
C2:E9:BF:F9:D3:DF:4C:8F:3C:5F:22:9E:AF:0B:42:9D
5. 最后,用测试证书来签名JAR文件
jarsigner -keystore myKeystore test.jar myself
针对所有的JAR文件重复这个步骤。
Ø How to Encode JNLP Files
为了编码(encode)一个JNLP文件,在XML prolog中指定encoding:
<?xml version="1.0" encoding="utf-16"?>
注意:这个XML prolog本身必须是UTF-8-encoded的
Ø Dynamic Download of HTTPS Certificates
未完!