Java 中文官方教程 2022 版(十二)(3)https://developer.aliyun.com/article/1486359
设置 Cookies
以下代码片段显示了CookieAccessor
类的setCookieUsingCookieHandler
方法:
public void setCookieUsingCookieHandler() { try { // instantiate CookieManager CookieManager manager = new CookieManager(); CookieHandler.setDefault(manager); CookieStore cookieJar = manager.getCookieStore(); // create cookie HttpCookie cookie = new HttpCookie("UserName", "John Doe"); // add cookie to CookieStore for a // particular URL URL url = new URL("http://host.example.com"); cookieJar.add(url.toURI(), cookie); System.out.println("Added cookie using cookie handler"); } catch(Exception e) { System.out.println("Unable to set cookie using CookieHandler"); e.printStackTrace(); } }
如检索 Cookies 所示,CookieManager
类是管理 Cookie 的主要入口点。创建CookieManager
类的实例,并将该实例设置为默认的CookieHandler
。
使用所需信息创建HttpCookie
。在我们的示例中,我们创建了一个将UserName
设置为John Doe
的新HttpCookie
。
接下来,将 Cookie 添加到底层的 Cookie 存储中。
运行 Cookie 小程序示例
要访问 Cookies,您必须对您的 RIA JAR 文件进行签名,并请求在安全沙箱之外运行的权限。请参阅jarsigner
工具的文档,了解如何对 JAR 文件进行签名。有关请求权限的信息,请参阅富互联网应用程序中的安全性。
下载源代码以进一步实验Cookie Applet示例。
丰富互联网应用程序中的安全性
原文:
docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/security.html
丰富互联网应用程序(RIAs)背后的安全模型旨在保护用户免受恶意互联网应用程序的侵害。本主题讨论了适用于小程序和 Java Web Start 应用程序的安全方面。有关更多信息,请参阅以下主题:
- 小程序的能力和限制
- Java Web Start 和安全性
RIAs 可以限制在 Java 安全沙箱中运行,或请求权限访问安全沙箱之外的资源。第一次启动 RIA 时,用户将被提示是否允许运行。显示的对话框提供有关签名者证书的信息,并指示 RIA 是否请求在安全沙箱之外运行的权限。用户随后可以做出知情决定是否运行应用程序。
请遵循以下准则来帮助保护您的 RIAs。
- 使用来自认可的证书颁发机构的证书对 RIA 的 JAR 文件进行签名。有关更多信息,请参阅 签署和验证 JAR 文件 主题。
- 如果 RIA 需要访问安全沙箱之外的资源,请在 RIA 的 JNLP 文件中指定
all-permissions
元素。否则,让 RIA 默认在安全沙箱中运行。以下代码片段显示了 RIA 的 JNLP 文件中的all-permissions
元素。
<security> <all-permissions/> </security>
- 如果使用 applet 标签,请参阅 使用 applet 标签部署 以获取有关设置权限级别的信息。
- 一个 JNLP 文件只能包含由相同证书签名的 JAR 文件。如果您有使用不同证书签名的 JAR 文件,请在单独的 JNLP 文件中指定它们。在 RIA 的主 JNLP 文件中,使用
component-desc
元素来包含其他 JNLP 文件作为组件扩展。有关详细信息,请参阅 JNLP 文件的结构。 - 对于 RIAs 的安全模型不允许来自网页的 JavaScript 代码调用签名 JAR 文件中的安全敏感代码,除非您明确启用此功能。在签名的 JAR 文件中,将您希望 JavaScript 代码能够调用的代码部分包装在
AccessController.doPrivileged
块中。这样,当执行doPrivileged
代码块中的代码时,JavaScript 代码可以以提升的权限运行。 - 尽量避免在 RIA 中混合特权和沙箱组件,因为它们可能会引发有关混合代码的安全警告。有关更多信息,请参阅 混合特权代码和沙箱代码。
- 在 JAR 文件清单中包含
Permissions
和Codebase
属性,以确保您的 RIA 请求仅限于您指定的权限,并且该 RIA 是从正确的位置访问的。查看用于安全性的 JAR 文件清单属性获取更多信息。 - JAR 文件清单属性使您能够限制对您的 RIA 的访问,并有助于确保您的代码不被篡改。查看使用清单属性增强安全性获取所有可用的 JAR 文件清单属性的信息。
保护富互联网应用程序的指南
docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/devGuidelines.html
以下指南提供了您可以采取的步骤,以减少您向用户提供的富互联网应用程序(RIA)的漏洞性。
- 遵循安全编码指南
- 使用最新版本的 JRE 进行测试
- 包含清单属性
- 使用已签名的 JNLP 文件
- 签名和时间戳 JAR 文件
- 使用 HTTPS 协议
- 避免本地 RIA
遵循安全编码指南
遵循Java 编程语言安全编码指南中的建议。第 4 节“可访问性和可扩展性”描述了如何限制对类和包的访问权限,从而降低代码的漏洞性。
JavaScript 代码被认为是不安全的,并且默认情况下受到安全沙箱的限制。最小化您的 RIA 与 JavaScript 代码之间的交互。谨慎使用AccessController.doPrivileged
块,因为它允许从任何 HTML 页面或 JavaScript 代码访问。
使用最新版本的 JRE 进行测试
确保您的 RIA 在最新的安全版本的 JRE 上运行。Java 平台支持 RIA 指定运行 RIA 所需的 Java 版本的能力,然而,要求用户维护多个 JRE 版本,尤其是旧的、不安全的版本,对用户来说是一个安全风险。
RIA 的一个好处是更新版本的 RIA 会自动下载到用户的系统中。测试您的 RIA 与每个 JRE 更新版本,并确保其正常工作。如果需要更改,请在服务器上更新您的 RIA,以便用户可以安装最新的 JRE 并仍然运行 RIA。
包含清单属性
向 JAR 文件清单添加属性,描述 RIA 的属性。与 JNLP 文件或applet
标记中的值进行比较,以验证运行正确的代码。
当您的 RIA 不需要超出安全沙箱的访问权限时,请请求沙箱权限。Java 沙箱为用户提供了额外的保护,如果用户不理解为什么需要无限制访问其系统,则可能不运行特权应用程序。
清单属性还可用于标识可以访问您的 RIA 的位置。这包括 JavaScript 代码可以调用您的 RIA 的位置,以及可以启动您的 RIA 的 JNLP 文件或 applet 标记的位置。有关可用的清单属性的信息,请参阅使用清单属性增强安全性。
使用已签名的 JNLP 文件
如果您的 RIA 需要访问非安全系统属性或 JVM 参数,请使用已签名的 JNLP。如果需要外部和内部 JNLP 文件之间的某种变化,请使用 JNLP 模板。查看 已签名的 JNLP 文件 了解信息。
要访问非安全系统属性或 JVM 参数,请按照 设置受信任参数和安全属性 中描述的在 JNLP 文件中包含属性或参数。
对 JAR 文件进行签名和时间戳
从受信任的证书颁发机构获取代码签名证书,并用它来签署您的 RIA 的 JAR 文件。仅部署使用有效证书签名的 RIA 给用户。
当您对 JAR 文件进行签名时,也要对签名进行时间戳。时间戳验证证书在签署 JAR 时是有效的,因此当证书过期时,RIA 不会自动被阻止。查看 签署 JAR 文件 了解有关签署和时间戳的信息。
自签名和未签名的 RIA 被视为不安全,并且除非设置例外站点列表或部署规则集以允许特定应用程序运行,否则不允许运行。但是,自签名对于测试目的可能是有用的。要使用您的自签名 RIA 进行测试,您可以将自签名证书导入到受信任的密钥库中。
使用 HTTPS 协议
使用 HTTPS 协议为用户获取您的 RIA 的 Web 服务器。HTTPS 协议是加密的,并由服务器验证,使任何人更难篡改您的 RIA。
避免本地的 RIA
本地的 RIA 不适用于生产环境。为确保用户运行您打算让他们运行的代码,请将您的 RIA 托管在应用程序服务器上。
为了测试,建议使用 Web 服务器。另一个选项是将您的应用程序添加到例外站点列表中,在 Java 控制面板的安全选项卡中进行管理。
问题和练习:更多关于富互联网应用程序的内容
原文:
docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/QandE/questions.html
问题
- 真或假:富互联网应用程序(RIAs)可以通过在属性名称前加上
"jnlp."
来设置安全属性。 - 真或假:只有签名的富互联网应用程序(RIAs)才能使用 JNLP API 访问客户端上的文件。
练习
- 在以下的 JNLP 文件中,添加一个名为
jnlp.foo
的安全属性,并将其值设置为true
。
<?xml version="1.0" encoding="UTF-8"?> <jnlp spec="1.0+" codebase="" href=""> <information> <title>Dynamic Tree Demo</title> <vendor>Dynamic Team</vendor> </information> <resources> <!-- Application Resources --> <j2se version="1.6+" href= "http://java.sun.com/products/autodl/j2se" /> <jar href="DynamicTreeDemo.jar" main="true" /> </resources> <applet-desc name="Dynamic Tree Demo Applet" main-class="components.DynamicTreeApplet" width="300" height="300"> </applet-desc> <update check="background"/> </jnlp>
检查你的答案。
课程:深入部署
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/index.html
富互联网应用程序(RIA)部署涉及各种技术和工具,如 Java 网络启动协议(JNLP)、部署工具包、pack200、jarsigner 等。本课程探讨了这些技术和工具如何帮助开发人员部署 RIA(小程序和 Java Web 启动应用程序)。
参与 RIA 部署的主要组件如下:
- RIA 将部署在其中的 HTML 页面
- RIA 的 JNLP 文件
- 包含 RIA 类文件和资源的 JAR 文件
这些组件在后续主题中会提到。
用户接受 RIA
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/userAcceptance.html
为了安全起见,在首次启动 RIA 之前,用户会被提示是否允许运行 RIA,即使应用程序已签名或不需要超出安全沙箱的访问权限。提示包括以下信息,取决于正在运行的 RIA:
- RIA 的名称,或者通知应用程序未签名。
- 如果应用程序使用来自受信任机构颁发的证书进行签名,则会显示有关发布者的信息。如果证书已过期,则会包含警告。如果应用程序是自签名的,则发布者显示为 UNKNOWN。
- 如果证书已过期、被吊销或无法检查吊销状态,则会收到警告。
- 应用程序访问的位置。
- 应用程序所需的访问级别。有限访问将应用程序限制在安全沙箱中,无限制访问将使应用程序能够访问用户系统上的资源。
- 如果建议的属性不存在,则会警告缺少 JAR 文件清单属性。
- 对于未签名或自签名的应用程序,用户必须选择接受应用程序的复选框。
- 在某些情况下,有选择不再显示提示的选项。
有关提示的描述,请参阅当我看到 Java 的安全提示时应该怎么做?
如果用户运行的 JRE 版本过时,他们也会收到警告,并有机会在运行应用程序之前更新到最新版本。用户还可以选择使用系统上的 JRE 运行,或者阻止应用程序运行。
Java 控制面板中的安全级别设置确定用户是否有机会运行 RIA。默认设置为高,会提示用户是否允许运行使用有效证书签名并在主 JAR 文件的清单中包含 Permissions 属性的应用程序。如果无法检查应用程序的吊销状态,则用户还可以在用户的许可下运行应用程序。
对 RIA 进行签名为用户提供了一定程度的信任。在准备应用程序部署时,请考虑以下事项:
- 最佳用户体验是由使用受认可证书颁发机构颁发的证书签名的应用程序提供的。
- 除非已创建例外站点列表或部署规则集以明确允许应用程序运行,否则不允许运行自签名和未签名的应用程序。
- 签名应用程序可以是特权应用程序或沙箱应用程序。特权应用程序可以无限制地访问用户系统上的资源。沙箱应用程序受限于 Java 安全沙箱。未签名应用程序受限于沙箱。
部署工具包
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/depltoolkit_index.html
部署工具包脚本是一组 JavaScript 函数,可以帮助开发人员在各种浏览器和操作系统配置中一致地部署丰富的互联网应用程序(RIA)。部署工具包脚本评估底层浏览器和操作系统,并使用正确的 HTML 部署 RIA。此脚本还可以确保客户端计算机上存在所需版本的 Java 运行时环境(JRE)软件。部署工具包脚本是在 Java 平台标准版 6 更新 10 发布中引入的。
部署工具包脚本位置
部署工具包脚本位于以下网址:
**http:**//www.java.com/js/deployJava.js
(见 note)。**https:**//www.java.com/js/deployJava.js
– 在安全页面部署您的小程序时,请使用来自此安全位置的部署工具包脚本,以避免页面加载时出现混合内容警告。
注意: **http:**//www.java.com/js/deployJava.js
网址正在逐步淘汰。请使用 **https:**//www.java.com/js/deployJava.js
网址启动所有应用程序。
此位置的 JavaScript 代码已经被最小化,以便快速加载。您可以在https://www.java.com/js/deployJava.txt
查看带有相关注释块的 JavaScript 代码的可读版本。
注意: 客户端浏览器应启用 JavaScript 解释器,以便部署工具包脚本能够正确运行并部署您的 RIA。
部署小程序
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/runAppletFunction.html
你可以通过使用部署工具包脚本的runApplet
函数来部署小程序。runApplet
函数确保客户端上存在所需的最低版本的 Java 运行环境(JRE)软件,然后运行小程序。runApplet
函数生成一个带有提供信息的 HTML 标签。
注意: 根据浏览器类型,当尝试查看网页源代码时,可能无法查看部署工具包脚本生成的 HTML。要查看生成的 HTML,请尝试在加载后保存 HTML 页面,或使用类似 Firebug(Mozilla Firefox 附加组件)的工具。
你可以通过指定部署选项作为
标签的属性和参数来部署小程序。你也可以在 Java 网络启动协议(JNLP)文件中指定部署选项以利用高级功能。有关此协议的更多信息,请参阅 Java 网络启动协议主题。
注意:
如果客户端没有所需的 JRE 软件的最低版本,部署工具包脚本会将浏览器重定向到
http://www.java.com
,以允许用户下载最新的 JRE 软件。在某些平台上,用户可能在查看包含小程序的网页之前被重定向。
runApplet
函数的参数取决于是否使用 JNLP。通过 JNLP 部署的小程序只能在客户端机器上存在下一代 Java 插件软件时运行(下一代 Java 插件软件是在 Java 平台标准版 6 更新 10 发布中引入的)。
下一节将展示如何在将显示小程序的 HTML 页面中使用
runApplet
函数。描述了以下使用场景:
作为属性和参数名称值对指定部署选项
使用
jnlp_href
参数在 JNLP 文件中指定部署选项指定属性和参数名称值对以及 JNLP 文件(使小程序能够在旧版和下一代 Java 插件软件上运行)
函数签名:
runApplet: function(attributes, parameters, minimumVersion)
参数:
attributes
– 生成的标签的属性的名称和值
parameters
– 生成的标签中
标签的名称和值
minimumVersion
– 运行此小程序所需的 JRE 软件的最低版本作为属性和参数名称值对指定部署选项
作为属性名称值对传递的属性和参数将被写入生成的标签中的属性和嵌套的
标签中。以这种方式部署的小程序可以通过旧版 Java 插件软件运行。
// launch the Java 2D applet on JRE version 1.6.0 // or higher with one parameter (fontSize) <script src= "https://www.java.com/js/deployJava.js"></script> <script> var attributes = {code:'java2d.Java2DemoApplet.class', archive:'Java2Demo.jar', width:710, height:540}; var parameters = { fontSize:16, permissions:'sandbox' }; var version = '1.6'; deployJava.runApplet(attributes, parameters, version); </script>
- 在浏览器中打开
DeployUsingNameValuePairs.html
以查看 Java2D 小程序。
- 注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)7版本。
- 使用
jnlp_href
参数在 JNLP 文件中指定部署选项
作为属性名称值对传递的属性和参数(在这种情况下是jnlp_href
)将被写入生成的标签中的属性和嵌套的
标签中。以这种方式部署的小程序只能通过下一代 Java 插件软件运行。最好将小程序的宽度和高度指定为属性,如下所示:
<script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = { code:'java2d.Java2DemoApplet', width:710, height:540 }; var parameters = { jnlp_href: 'java2d.jnlp' }; deployJava.runApplet(attributes, parameters, '1.6'); </script>
- 在浏览器中打开
DeployUsingJNLP.html
以查看 Java2D 小程序。
- 注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)6 更新 10版本。
- 指定属性和参数名称值对以及 JNLP 文件
通过使用 JNLP 部署的小程序只能在最终用户的浏览器上运行下一代 Java 插件软件。如果你希望你的小程序也在旧版 Java 插件软件上运行,请使用属性和参数名称值对以及 JNLP 文件指定部署选项。
<script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = {code:'java2d.Java2DemoApplet.class', archive:'Java2Demo.jar', width:710, height:540}; var parameters = { fontSize:16, jnlp_href:'java2d.jnlp' }; var version = '1.6' ; deployJava.runApplet(attributes, parameters, version); </script>
如果一些部署选项在属性名称值对和 JNLP 文件中有不同的值,以下准则会很有帮助:
- 将
width
和height
指定为属性名称值对(不在 JNLP 文件中)。 - 将参数如
image
和boxbgcolor
指定为参数名称值对(不在 JNLP 文件中)。这些参数在小程序启动过程中需要提前。 - 在 JNLP 文件中,将
codebase
属性留空或指定绝对 URL。当codebase
属性留空时,默认为包含 JNLP 文件的目录。 - 如果小程序是使用 JNLP 文件启动的,则
code
、codebase
和archive
属性的值将从 JNLP 文件中获取。如果这些属性也分别作为属性名称值对指定,那么属性名称值对将被忽略。
在浏览器中打开
DeployUsingNameValuePairsAndJNLP.html
以查看 Java2D 小程序。
注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)7版本。
下载源代码以进一步进行实验。
在小程序标签中嵌入 JNLP 文件
原文:
docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/embeddingJNLPFileInWebPage.html
当使用 Java Network Launch Protocol (JNLP) 部署小程序时,Java 插件软件会在从网络下载 JNLP 文件后启动小程序。从 Java SE 7 版本开始,您可以通过将 JNLP 文件嵌入到网页中来减少小程序启动时间,从而避免第一次加载小程序时额外的网络请求。这将导致小程序在 Web 浏览器上快速启动。
在网页中部署小程序时,可以将 Base64 编码的 JNLP 文件嵌入到
jnlp_embedded
参数中。元素的属性应满足以下限制:
href
属性应包含相对路径。- 不应指定
codebase
属性。这意味着代码库将从加载小程序的网页的 URL 派生。
以下步骤描述了如何在网页中嵌入 JNLP 文件以部署小程序。
- 为您的小程序创建一个
JNLP
文件。下面显示了一个示例文件。
<?xml version="1.0" encoding="UTF-8"?> <!-- href attribute contains relative path; codebase attribute not specified --> <jnlp href="dynamictree_applet.jnlp"> <information> <title>Dynamic Tree Demo</title> <vendor>Dynamic Team</vendor> </information> <resources> <!-- Application Resources --> <j2se version="1.7+" /> <jar href= "dist/applet_ComponentArch_DynamicTreeDemo/DynamicTreeDemo.jar" main="true" /> </resources> <applet-desc name="Dynamic Tree Demo Applet" main-class="appletComponentArch.DynamicTreeApplet" width="300" height="300"> </applet-desc> <update check="background"/> </jnlp>
- 使用 Base64 方案对 JNLP 文件的内容进行编码。您可以使用任何 Base64 编码工具对 JNLP 文件进行编码。查看工具的用法以创建具有 Base64 编码的字符串。可以使用的一些工具和网站示例如下:
- UNIX 命令 –
base64
,uuencode
- 网站 – Base64 编码和解码, Base64 编码器
- 在网页中部署小程序时,指定
jnlp_embedded
参数,并将其值设置为 Base64 编码的 JNLP 字符串。确保只包含实际的 Base64 字节,不包含任何编码工具特定的头部或尾部。
<script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = {} ; <!-- Base64 encoded string truncated below for readability --> var parameters = {jnlp_href: 'dynamictree_applet.jnlp', jnlp_embedded: 'PCEtLSANCi8qDQogKiBDb ... bmxwPg==' } ; deployJava.runApplet(attributes, parameters, '1.6'); </script>
- 一些编码工具可能会将编码后的字符串包装成几个 76 列的行。要在 JavaScript 代码中使用这种多行属性值,请将属性值指定为一组连接的字符串。如果小程序直接使用
HTML 标签部署,则可以按原样包含多行属性值。
在浏览器中打开
AppletPage.html
以查看通过在网页中嵌入 JNLP 文件启动的动态树演示小程序。
注意: 如果您看不到小程序运行,请至少安装Java SE Development Kit (JDK) 7版本。
注意: 如果您看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
下载源代码以进一步进行实验的嵌入式 JNLP 示例。
- 在浏览器中打开
- 在浏览器中打开
用法: