13

发出 HTTP 请求时,applet 与其托管浏览器之间是否有任何交互,或者请求是否完全独立于本机浏览器代码?

具体来说,在浏览器中运行的 Java 小程序是否有某种隐含的方式来共享浏览器的会话状态和缓存?

我从非权威来源阅读了一些帖子,说当一个小程序发出 HTTP 请求时,它将使用浏览器的缓存,并且它还将(以某种方式)访问浏览器的 cookie。

我使用的测试URLConnection表明情况并非如此,我的直觉是这听起来太方便了,不可能是真的。我会假设 JVM 中对 JVM 之外的世界一无所知,这意味着唯一可行的方法是,如果 JVM 实现特定于浏览器,则它的 URL 相关方法的实现委托给本机浏览器代码?

如果 cookie 数据不是隐式共享或可用的,最好将param标签中的会话 ID 传递给小程序?这种方法是否存在安全问题?如果小程序不使用浏览器的缓存来处理请求,那么在小程序缓存请求是如何工作的?

4

5 回答 5

5

Applet 由 Java Plugin 执行,Java Plugin 是一个浏览器插件。小程序确实是浏览器加载的 HTML 页面的一部分,可以与浏览器 DOM 和页面中的 JavaScript 代码通信,并使用浏览器向其原始服务器发送请求。

有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/deployment/applet/appletExecutionEnv.htmlhttp://docs.oracle.com/javase/tutorial/deployment/applet/server.html

于 2012-06-20T08:40:46.497 回答
5

我对 Windows 7、Java 1.6.23 和 Firefox、Chrome 和 Internet Explorer 的测试是,HttpURLConnection来自 applet 的 JVM 内的 s不会与浏览器交互。他们使用缓存,也没有添加 cookie 标头。

于 2012-10-22T07:52:21.163 回答
2

我认为这取决于Java插件。我的经验是,它通常使用浏览器缓存进行网络连接,通常它会传输 cookie。我必须先清空浏览器缓存才能在小程序中获取新文件。

如果您查看 Oracle Java 7 插件控制面板,您将在网络参数中看到一个选项,用于对小程序使用直接连接,但默认设置是使用“浏览器参数”。

至于 cookie,我过去曾见过一些不传输会话 cookie 的 Java 插件,特别是在 MacOS X 上(Apple 甚至提出了一种解决方法)。但是大多数开发人员现在都假设它们是被传输的,并且在实践中它通常是有效的。

于 2012-06-20T08:35:57.500 回答
1

Applet 默认不共享会话信息,但您可以在初始化时通过 Applet 参数传递会话 ID。并为每个 HTTP 请求使用会话 ID。

于 2012-06-20T08:36:52.853 回答
0

Applet 可以与浏览器交互,通过 JavaScript 调用发出 HTTP 请求。

如果您使用任何 Java HTTP API,例如 UrlConnection、Apache HTTPClient、java.net.Socket,这些库将不会与浏览器交互。它们的行为就好像它们在独立的 JVM 中一样。缓存 id 取决于您使用的 API,Apache HttpClient 有一个缓存。URLConnection 让您可以轻松地编写自己的缓存。

您还不能直接访问 JavaScript 中的现有缓存,它即将推出。https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage

一旦页面被渲染,参数标签就不能改变,例如 OAuth 令牌需要定期刷新。您可以通过 JavaScript 从浏览器中获取 cookie,然后手动将它们添加到 Java 发起的 HTTP 请求中。这种机制允许它们被更新。

共享 cookie 不会增加太多风险。如果 cookie 上有 HTTPOnly 标志,则必须删除该标志。

如果您在浏览器中允许使用 Java,那么您的用户几乎可以让您做任何事情。浏览器中的 Java 确实有一个沙箱,但它很容易被破解。如果您可以在没有 Java 的情况下设计应用程序,那么它们对用户来说会更加安全。

从编写 Applet 的人的角度来看,Java 比浏览器中的 JavaScript 更安全且更灵活。

于 2019-02-01T19:22:45.683 回答