在发出HTTP请求时,applet与其托管浏览器之间是否存在任何交互,或者请求是否完全独立于本机浏览器代码?
具体来说,在浏览器中运行的Java applet是否有一些隐含的方式来共享浏览器的会话状态和缓存?
我已经阅读了一些来自非权威人士的帖子,说当applet发出HTTP请求时会使用浏览器的缓存,并且它也可以访问浏览器的cookie(<某种方式)。
我使用URLConnection
进行的测试表明情况并非如此,而我的直觉是,这听起来太方便了。我假设JVM中的任何内容都不知道JVM之外的世界,这意味着唯一可行的方法是,如果JVM实现特定于浏览器,则其URL相关方法的实现委托给本机浏览器代码?
如果未隐式共享或提供Cookie数据,最佳做法是将param
标记中的会话ID传递给applet吗?这种方法是否存在安全问题?如果applet没有使用浏览器的缓存来处理请求,那么如何缓存applet中的请求呢?
答案 0 :(得分:5)
Applet由Java插件执行,Java插件是一个浏览器插件。 applet确实是浏览器加载的HTML页面的一部分,可以与浏览器DOM和页面中的JavaScript代码进行通信,并使用浏览器向其原始服务器发送请求。
有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/deployment/applet/appletExecutionEnv.html和http://docs.oracle.com/javase/tutorial/deployment/applet/server.html。
答案 1 :(得分:5)
我使用Windows 7,Java 1.6.23和Firefox,Chrome和Internet Explorer进行的测试是,applet的JVM 中的HttpURLConnection
与浏览器无法进行交互。他们不使用缓存,不添加了Cookie标头。
答案 2 :(得分:2)
我认为这取决于Java插件。我的经验是,通常它使用浏览器缓存进行网络连接,通常它会传输cookie。我必须先清空浏览器缓存才能在applet中获取新文件。
如果查看Oracle Java 7插件控制面板,您将在网络参数中看到一个选项,可以使用applet的直接连接,但默认情况下使用“浏览器参数”。
至于cookies,我在过去看到过一些没有传输会话cookie的Java插件,特别是在MacOS X上(Apple甚至提出了一种解决方法)。但是大多数开发人员现在都认为它们是传输的,并且在实践中它通常可以工作。
答案 3 :(得分:1)
默认情况下,小程序不共享会话信息,但您可以在初始化时通过Applet参数传递会话ID。并为每个HTTP请求使用会话ID。
答案 4 :(得分:0)
Applet可以与浏览器进行交互,以通过JavaScript调用发出HTTP请求。
如果您使用任何Java HTTP API,例如UrlConnection,Apache HTTPClient,java.net.Socket这些库将不会与浏览器进行交互。它们的行为就像在独立的JVM中一样。 在您使用的API上缓存ID依赖,Apache HttpClient有一个缓存。 URLConnection使您足够容易地编写自己的缓存。
您不能直接使用在JavaScript中现有的缓存,但它的寿正在添加。 Cross Validated。
页面渲染后,param标签就无法更改,例如OAuth令牌需要定期刷新。 您可以通过JavaScript从浏览器中获取Cookie,并将其手动添加到Java启动的HTTP请求中。这种机制允许它们被更新。
没有太多额外的风险共享的cookie。你将不得不删除该Cookie中HTTPOnly标志,如果存在的话。
如果您在浏览器中允许Java,则您的用户可以执行几乎所有操作。 Java的浏览器里面确实有一个沙箱,但其令人担忧的是容易摆脱。如果你能设计的应用程序不带Java,他们将成为用户安全得多。
从编写Applet的人的角度来看,Java比浏览器中的JavaScript安全且灵活得多。