2014-09-05 72 views
9

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

背景: 我目前工作的一个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)解决了我的大部分问题,但我想在“脱机环境”中以自动方式测试此回归功能。

+1

这是否回答你的问题? http://stackoverflow.com/questions/4645588/how-to-disable-all-network-connections-in-java – Dunes 2014-09-05 08:36:31

+3

我一定会用Java安全。如果有什么可以保证JVM范围的,就是这样。 – 2014-09-05 08:40:41

+0

@Dunes看起来很有前途,谢谢!我应该搜索“网络连接”而不是“Internet连接”... – RobertG 2014-09-05 09:09:35

回答

2

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

这里是什么,我会用它来防止网络连接:

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

不可否认,我没有测试过这个,但我认为应该有可能创建java.net.SocketImplFactory,这会创建SocketImpl s,在例如。被称为connect

正如其他人所指出的那样,也有可能定义一个安全管理器。我想,主要的区别是,会有什么样的例外。我不认为有什么办法来防止投掷SecurityException真是让人不是SocketException S或其他IOException s,这可能是重要的正确测试错误处理代码这样的解决方案。

+1

这与任何NIO代码无关。 – 2014-09-05 08:38:44

+0

@MarkoTopolnik:如果你使用'Socket.setSocketImplFactory'设置它,至少所有使用'java.net.Socket'的代码都会被迫使用它。 – Dolda2000 2014-09-05 08:40:42

+1

它只能被调用一次。然而,你肯定对NIO是正确的。不过,这取决于OP的情况可能会或可能不会成为问题。我不能说我知道XML处理工具是否使用'java.net'或NIO。 – Dolda2000 2014-09-05 08:41:43

1

您可以使用XML catalog存储在本地硬盘上的外部模式(XSD + DTD)。这也加快了正常处理速度,并允许快速离线开发。

这是一个标准机制。

(特别是对于欢颜XHTML是有大量的HTML实体。)

+0

不错的提示,谢谢!我想这比我的NullEntityResolver更清洁。 但我想这需要一些努力才能知道如何配置东西... – RobertG 2014-09-05 09:08:28

+0

我不记得的努力,但是完全开箱即用的配置不是。事实上,我首先做了一个实体解析器从PUBLIC切换到SYSTEM(本地磁盘)。但是这也是开销。 – 2014-09-05 09:24:15