有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java正在从HostServices捕获SecurityException。展示文件

我有一个实例化了安全控制器的应用程序。我让那部分工作。调用HostServices时,我正在测试一个安全异常。showDocument()和我可以在日志中看到“拒绝访问”消息。我还在日志中看到异常:

access: access denied ("java.io.FilePermission" "<<ALL FILES>>" "execute")
java.lang.Exception: Stack trace
    at java.base/java.lang.Thread.dumpStack(Thread.java:1388)
    at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:462)
    at java.base/java.security.AccessController.checkPermission(AccessController.java:897)
    at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
    at java.base/java.lang.SecurityManager.checkExec(SecurityManager.java:572)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1096)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
    at java.base/java.lang.Runtime.exec(Runtime.java:592)
    at java.base/java.lang.Runtime.exec(Runtime.java:451)
    at com.sun.javafx.application.HostServicesDelegate$StandaloneHostService.showDocument(HostServicesDelegate.java:146)
    at javafx.application.HostServices.showDocument(HostServices.java:115)

     ... snip ...

但是,应用程序中没有例外。代码调用showDocument()方法并跳过catch块,就好像没有发生异常一样。因此,我查看了openjfx的代码,在HostServicesDeletgate.java中有一个小贴士

@Override
        public void showDocument(final String uri) {
            String osName = System.getProperty("os.name");
            try {
                if (osName.startsWith("Mac OS")) {
                    Desktop.getDesktop().browse(URI.create(uri));
                } else if (osName.startsWith("Windows")) {
                    Runtime.getRuntime().exec(
                            "rundll32 url.dll,FileProtocolHandler " + uri);
                } else { //assume Unix or Linux
                    String browser = null;
                    for (String b : browsers) {
                        if (browser == null && Runtime.getRuntime().exec(
                                new String[]{"which", b}).getInputStream().read() != -1) {
                            Runtime.getRuntime().exec(new String[]{browser = b, uri});
                        }
                    }
                    if (browser == null) {
                        throw new Exception("No web browser found");
                    }
                }
            } catch (Exception e) {
                // should not happen
                // dump stack for debug purpose
                e.printStackTrace();
            }
        }

因此,他们使用showDocument()方法中的异常(我个人认为这是一种糟糕的形式,但可能是有原因的)

想到的一个解决方案是在调用showDocument()方法之前检查权限。有更好的解决办法吗


共 (0) 个答案