2011-06-25 35 views
6

假设我有以下简单的小程序。我想知道获取jar的http请求是由浏览器还是由jvm创建的。如果它是由jvm制作的,是否将浏览器的cookie和会话发送到服务器?由浏览器或JVM下载Applet jar吗?

<APPLET 
    CODE="FieldTestF.class" 
    WIDTH="100%" HEIGHT="90" 
    ARCHIVE = "FieldTestF.jar" 
    > 
This example uses an applet. 
</APPLET> 
+0

在Safari浏览器至少,小程序不会触发'onload'事件,所以我会想说的是,HTTP请求是由JVM做。 – zneak

回答

5

我想我可以看着它,但它似乎更有趣嗅探浏览器,并找到了相应的服务器之间的连接。

原来这个请求是由JVM完成的。这是可观察的,因为:

  • 用户代理是Mozilla/4.0 ([OS here]) Java/[Java version here]而不是您的浏览器发送的任何内容;
  • 该小程序文件请求不是源自浏览器请求所来自的相同端口;
  • 浏览器不会确认请求日志中的请求&开发人员工具。

但是,当浏览器发出HTTP请求时,似乎会将Cookie传递给JVM,这意味着您的会话数据应该可用。

6

JVM是由JVM下载的。所有applet都与一个URLClassloader实例(或者一个子类 - Sun JVM中的sun.applet.AppletClassLoader)关联,负责加载applet所需的所有类和资源。

显然,在Java运行时中可以使用加载类文件和资源所需的大部分基础结构,并且重复使用它们可以使Java插件不必担心大多数情况下访问浏览器内部组件。

我将在这里重现OpenJDK代码库的显着部分,它执行此活动。你会在sun.applet.AppletPanelrunLoader()方法找到有趣的东西:

/** 
* Load the applet into memory. 
* Runs in a seperate (and interruptible) thread from the rest of the 
* applet event processing so that it can be gracefully interrupted from 
* things like HotJava. 
*/ 
private void runLoader() { 
    if (status != APPLET_DISPOSE) { 
     showAppletStatus("notdisposed"); 
     return; 
    } 

    dispatchAppletEvent(APPLET_LOADING, null); 

    // REMIND -- might be cool to visually indicate loading here -- 
    // maybe do animation? 
    status = APPLET_LOAD; 

    // Create a class loader 
    loader = getClassLoader(getCodeBase(), getClassLoaderCacheKey()); 

    // Load the archives if present. 
    // REMIND - this probably should be done in a separate thread, 
    // or at least the additional archives (epll). 

    String code = getCode(); 

    // setup applet AppContext 
    // this must be called before loadJarFiles 
    setupAppletAppContext(); 

    try { 
     loadJarFiles(loader); // <-- this is what loads the JAR files 
     applet = createApplet(loader); 
     ... 

而且,让浏览器获取的资源将用于Java的安全模型使问题复杂化。这部分是由于applet使用自己设置的AccessControlContext。这个上下文有一个默认的权限集,当applet被初始化时,它被添加到它中;该集合包括SocketPermission以连接到托管代码库的服务器,或者FilePermission允许对包含代码库的文件系统进行读取访问。如果资源加载是由浏览器完成的,那么根据插件的实现方式,检查可能不会被执行,导致安全模型可能崩溃。

您可以通过查看网络流量来确认JVM的资源加载行为,如其他答案中所述。我将张贴Fiddler的截图作为确认。进程列指示哪个OS进程负责发送请求(在这种情况下恰好是Java应用程序启动器java.exe)。对于图像质量明显较差的道歉 - 您需要调整图像大小或在新窗口中打开它。

Fiddler capture of Applet download