禁用JVM的"Internet访问"?

Rob*_*rtG 11 java

我想知道是否有办法告诉JVM它无法连接到某个Java程序的任何Web资源,或者在执行此操作时立即失败,即执行相当于关闭Internet访问的软件硬件开关.这是为了协助自动测试,禁用系统的防火墙对我来说是没有选择的.

背景: 我目前正在研究一个Java问题,其中XML标识转换不适用于XML中引用的DOCTYPE,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
     height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<!-- content.... -->
</svg>
Run Code Online (Sandbox Code Playgroud)

DocumentBuilderFactory,TransformerFactory等的标准行为是访问Web以查找缺失的实体.虽然修复建议/sf/answers/657902171/(NullEntityResolver)解决了我的大多数问题,但我想在"离线环境"中以自动方式测试此功能以进行回归.

Rob*_*rtG 3

Dunes 的评论很有帮助(问题How to disable all network links in Java是相关的),我忽略了另一个问题。

这是我将用来阻止网络连接的方法:

  • 使用 JVM 参数启动测试用例-Djava.security.manager=default -Djava.security.policy=/java.policy
  • 作为 java.policy,我使用在 Java 安装中找到的默认文件,并添加了以下行 st stuff 适用于 TestNG:

    // // additional permissions for running TestNG // // 
    
    // TestNG reads a lot of properties...
    permission java.util.PropertyPermission "*", "read";
    
    // TestNG connects to a local port for debugging, and does some reflection magic
    permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
    permission java.lang.RuntimePermission "accessDeclaredMembers";
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
    
    // needs at least read access to (default) test suite folder location
    permission java.io.FilePermission "C:/Users/<me>/AppData/Local/Temp/-", "read, write";
    
    // if the test case (or, data provider) accesses any other files, add their location. or do it the lazy way:
    permission java.io.FilePermission "C:/-", "read, write";
    
    Run Code Online (Sandbox Code Playgroud)

使用该配置,对外部源(例如 www.w3.org)的任何访问都将导致 AccessControlException:

javax.xml.transform.TransformerException: java.security.AccessControlException: access denied (java.net.SocketPermission www.w3.org:80 connect,resolve)
Run Code Online (Sandbox Code Playgroud)