【问题标题】:Do Applets use Browser for HTTP Requests?Applet 是否使用浏览器进行 HTTP 请求?
【发布时间】:2012-06-22 07:36:06
【问题描述】:

在发出 HTTP 请求时,applet 和它们的宿主浏览器之间是否有任何交互,或者请求是否完全独立于本机浏览器代码?

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

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

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

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

【问题讨论】:

标签: java caching browser applet urlconnection


【解决方案1】:

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

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

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

【讨论】:

  • 您是否希望在使用 Firefox/IE9 和 URLConnection 时将会话 ID 附加到 HTTP 请求中?这在我的情况下不起作用。
  • 如果会话 ID 在 cookie 中,我会期望它。如果它在 URL 中,那么 URL 必须是完整的。如果它不适合你,我不知道为什么。
【解决方案2】:

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

【讨论】:

  • 现在我将会话 ID 作为小程序的参数传递,并在通过小程序向服务器发出任何请求时使用此会话 ID 进行身份验证。经过一番搜索,我阅读了您的建议,但我的问题是使用这种方法是否存在任何安全风险?
【解决方案3】:

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 了解更多信息。

【讨论】:

  • 谢谢!我认为您已经粘贴了两次相同的链接。
  • 糟糕。对不起。我现在已经修好了。
  • “使用浏览器发送请求”我做过的经验测试不支持 - 请求是由 JVM 直接使用 HttpUrlConnection 发出的
【解决方案4】:

我在 Windows 7、Java 1.6.23 和 Firefox、Chrome 和 Internet Explorer 上的测试是,来自 Applet JVM 的HttpURLConnections 不会与浏览器交互。他们使用缓存,并且添加了cookie标头。

【讨论】:

  • 已确认 - 我最近将 Spring Security 添加到了一个站点,该站点包含一个访问站点上安全资源的小程序。该小程序不再工作,因为它在 cookie 中缺少身份验证令牌。
【解决方案5】:

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 更安全且灵活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多