禁用JVM的“Internet访问”?

时间:2014-09-05 08:31:28

标签: 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>

DocumentBuilderFactory,TransformerFactory等的标准行为是访问网络中缺少的实体。 虽然修复建议https://stackoverflow.com/a/9398602/1143126(NullEntityResolver)解决了我的大多数问题,但我想在“离线环境”中以自动方式测试此功能以进行回归。

3 个答案:

答案 0 :(得分:2)

Dunes的评论帮助很多(问题How to disable all network connections in Java是相关的),我忽略了其他问题。

以下是我将用于阻止网络连接的内容:

  • 使用JVM参数启动测试用例 -Djava.security.manager = default -Djava.security.policy = / java.policy
  • 作为java.policy,我使用我在Java安装中找到的默认文件,并添加了以下几行s.t.这些东西适用于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";
    

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

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

答案 1 :(得分:1)

您可以在本地磁盘上使用存储外部架构(xsd + dtd)的XML catalog。这也加速了正常处理,并允许快速离线开发。

这是一种标准机制。

(特别值得学习的是XHTML,因为有大量的HTML实体。)

答案 2 :(得分:0)

不可否认,我没有对此进行过测试,但我认为应该可以创建java.net.SocketImplFactory来创建SocketImpl,这样可以在例如时引发适当的异常。 connect被称为。{/ p>

正如其他人所指出的,还有可能定义一个安全管理器。我猜,主要区别在于会抛出什么样的例外情况。我认为没有办法阻止这样的解决方案抛出SecurityException而不是SocketException或其他IOException,这对于正确测试错误处理代码可能很重要。