3

我在 Tomcat 5.0 中运行的 Web 应用程序中有一段代码,它调用javax.print.PrintServiceLookup方法lookupPrintServices(null, null)。以前,此代码返回一个相当大的数组,按预期列出服务器上的所有打印机。突然有一天,它开始表现不同,现在返回一个没有打印机的零大小数组。经过相当彻底的检查,我无法确定可能发生了什么变化,导致该方法现在的行为与以前不同。

我制作了一个包含相同方法调用的小型独立测试程序。

    PrintService[] printers = PrintServiceLookup.lookupPrintServices(null, null);

    System.out.println("Java Version: " + System.getProperty("java.version"));
    System.out.println("Printers found:");
    if (printers != null) {
        for (PrintService printer : printers) {
            if (printer != null) {
                System.out.println("    " + printer.toString());
            }
        }
    }
    System.out.println("End");

运行这个程序,它的反应不同,返回完整的打印机列表。仔细检查,我将相同的代码(使用日志记录语句而不是 System.print 语句)放在 Web App 的上下文初始化方法中,它仍然返回零打印机。该方法返回不同的结果,具体取决于它是从 Web 应用程序 War 还是独立 jar 中运行。

我的一些同事建议它可能与安全管理器有关,事实上,PrintService 类的文档安全管理器的某些属性可以改变方法调用的结果。但是,在我的测试中添加一些代码以检索和查看安全管理器之后,似乎在这两种情况下都没有。

    try {
        if (sec != null) {
            System.out.println(sec.toString());
            sec.checkPrintJobAccess();
        }
        System.out.println("*-*-*-*-*Printer Access allowed!!");
    }
    catch (SecurityException e) {
        System.out.println("*-*-*-*-*Printer NOT Access allowed!!");
    }

结果是安全管理器在这两种情况下都是空的

在不同的服务器上尝试,Web 应用程序和服务器的独立 jar 版本都不会返回打印机。我找不到一致性。

这里发生了什么? 是什么导致此 javax 方法调用在不同情况下返回不同的结果?Web 应用程序可能会发生什么变化以改变其在一天和第二天之间的行为?

4

1 回答 1

1

尝试使用此选项启动服务器-DUseSunHttpHandler=true以使用 JDK API 而不是服务器 API 启动 HTTP URL 连接。希望这对你也有效。

于 2016-08-12T22:09:45.787 回答