javax.imageio.IIOException:无法在Tomcat 9,OpenJDK 11和Geoserver中创建ImageInputStream

问题描述 投票:2回答:1

在处理javax.imageio.IIOException时:无法创建ImageInputStream!在调用ImageIO.read(文件文件)后,由于缺少FileImageInputStreamSpi提供程序,我发现我的webapp中可用的ImageIO服务提供程序取决于Geoserver(http://geoserver.org)webapp是否在同一个Tomcat Web容器中运行:

只有我的webapp运行:

  • 从RandomAccessFile实例化FileImageInputStream的服务提供者
  • 从File实例化FileImageInputStream的服务提供者
  • 从InputStream实例化FileCacheImageInputStream或MemoryCacheImageInputStream的服务提供者

我的webapp在Geoserver 2.15.0 webapp上运行:

  • NIO Channel ImageInputStream
  • 包装FileImageInputStream的服务提供者
  • 帮助连接到String指向的对象的服务提供者
  • 帮助连接到URL指向的对象的服务提供者
  • 从RandomAccessFile实例化FileImageInputStream的服务提供者

我的webapp中的代码:

IIORegistry reg = IIORegistry.getDefaultInstance();
Iterator<ImageInputStreamSpi> it = reg.getServiceProviders(ImageInputStreamSpi.class, true);
while (it.hasNext()) {
    ImageInputStreamSpi spi = it.next();
    System.out.println(spi.getDescription(Locale.GERMAN));
}

我正在使用Tomcat 9.0.16 webapp和OpenJDK 11。

我想知道为什么两个webapps都可能以这种方式干扰 - 这不是它实际上是一个安全问题吗?

感谢您的一般澄清。

java tomcat geoserver javax.imageio java-11
1个回答
4
投票

这是ImageIOIIORegistry的一个已知问题。注册表实例在VM上的所有应用程序之间共享。这通常会导致问题,例如你的情况。

我在TwelveMonkeys ImageIO项目的自述文件中写了一些关于Deploying ImageIO plugins in a Web App的文章。使用上下文侦听器可能有助于解决某些问题,但它并不能解决潜在的问题。

另一个修复方法是将ImageIO插件仅作为服务器本身的一部分(即共享库文件夹)进行部署,以确保所有Web应用程序都能看到相同的插件。


如果你深入了解IIORegistry的源代码,你会发现它实际上对多个注册表有一些支持,但是它们与AppContexts(applets,webstart等使用)有关,遗憾的是它与web应用程序上下文不同。它似乎应该可以使网络上下文也有不同的AppContexts,如果他们使用不同的ThreadGroups。但我从来没有找到一种方法让应用服务器为每个Web应用程序上下文分配不同的线程组。

© www.soinside.com 2019 - 2024. All rights reserved.