繁体   English   中英

是通过浏览器还是JVM下载的Applet jar?

[英]Is Applet jar downloaded by browser or by JVM?

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

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

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

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

我将在这里重现OpenJDK代码库的重要部分,它们执行此活动。 你会发现在有趣的东西runLoader()的方法sun.applet.AppletPanel

/**
 * 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捕获Applet下载

我想我可以查一下,但是嗅探浏览器和服务器之间的连接以找到答案似乎更有趣。

事实证明,请求是由JVM完成的。 这是可以观察到的,因为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM