如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?

Posted

技术标签:

【中文标题】如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?【英文标题】:Java 7 prevents FTP transfers on Windows Vista and 7 if firewall is on. Any ideas? 【发布时间】:2011-10-22 20:53:09 【问题描述】:

Java 7 阻止在 Windows Vista 和 7 上进行 FTP 传输。

在 FTP 中,在传输文件之前,必须发送 PORT 或 PASV 命令。一旦发送其中一个命令,Windows 防火墙就会关闭发送它的套接字。这只发生在防火墙打开并且没有 java.exe 异常的情况下。我怀疑这个问题与使用新 Vista IP 堆栈的 Java 7 有关。

有没有人知道如何解决或解决这个问题?我们正在分发一个 Java FTP 库,所以我们显然不能自己添加异常。

例外:

java.net.SocketException: Permission denied: recv failed

JRE 版本信息:

java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)

后续行动 1(2011 年 11 月 14 日): Oracle 分析了这个问题,发现它似乎是 Windows 防火墙和/或 IPv6 堆栈中的一个错误。他们设法用原生 C(即非 Java)应用程序复制了该问题,因此这是该错误不在 Java 中的有力证据。他们已经通知了微软,所以现在球在他们的球场上。更多详情请关注http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696

后续行动 2(2012 年 7 月 27 日): Oracle 的一位(非常有帮助的)联系人告诉我,该问题现在已在 Microsoft 升级。我们希望很快能看到一些结果。

后续行动 3(2012 年 8 月 15 日): 我们在 Oracle 的联系人告诉我们,Microsoft 已接受该错误并正在对其进行优先处理。

后续行动 4(2012 年 9 月 21 日): Microsoft 已经制作了一个补丁,目前正在由 Oracle 测试。没有发布日期的消息。

后续行动 5(2012 年 10 月 11 日): 终于成功了!微软已经公开发布了hotfix。他们暗示该修复程序将包含在未来的一般软件更新中:

“如果您没有受到此问题的严重影响,我们建议您等待包含此修补程序的下一个软件更新。”

【问题讨论】:

确实很烦人,它也会影响 Ant FTP 任务:java.net.SocketException: Permission denied: recv failed at org.apache.tools.ant.taskdefs.optional.net.FTP$FTPDirectoryScanner。 forceRemoteSensitivityCheck(FTP.java:695) 解决方法:***.com/questions/10473518/… ***.com/questions/17761759/… 【参考方案1】:

我已经向 Oracle 提交了错误报告,请参阅 bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696

他们将优先级标记为低,这让我认为他们不太了解问题的严重性,即 FTP 在 Java/Windows 上被破坏。我忘了在错误报告中明确说明这一点。如果其他人认为它应该具有更高的优先级,请在 Oracle 错误报告中添加评论。

我刚刚注意到你也可以为这个错误“投票”,所以如果你同意它很重要,请给它投票。

【讨论】:

解决方法:***.com/questions/10473518/…【参考方案2】:

这里有一个测试用例报告了同样的错误: Java 7 Socket Exception Bug论坛。 这是 Java 7 的问题

【讨论】:

【参考方案3】:

在此处发布有关此问题的博客: http://podzemski.com/2011/09/12/java-7-prevents-ftp-transfers-on-windows-when-firewall-is-on/

也许它会引起对问题的一些额外认识。

【讨论】:

谢谢。顺便说一句,主动传输(即 PORT 命令)也会受到影响。 感谢 HansA 的提醒,我会更改博文。【参考方案4】:

问题是由防火墙的状态 FTP 过滤器引起的。作为一种解决方法,您可以通过使用管理员权限执行 netsh advfirewall set global StatefulFTP disable 来禁用它。

【讨论】:

我在想我的代码有问题。愚蠢的 Win7 防火墙 + Java 交互。 +1。 确认这解决了 Java 1.7.0_09 和 Windows Vista Home Premium(带有 SP2)的问题。 为我工作,而且比 MS 的那个地狱般的修补程序快得多 netsh advfirewall set global StatefulFTP disable 对我有用 :)【参考方案5】:

这个问题可以在没有 JDK7 的情况下演示,它是 Windows 7 中的防火墙在应用程序使用 IPv6 映射的 IPv4 地址时阻止了 ftp 协议。有关更多详细信息和解决方法,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077696。

【讨论】:

【参考方案6】:

另一种解决方法是使用以下命令启动 JVM:

-Djava.net.preferIPv4Stack=true

【讨论】:

我在一个小程序中遇到了这个问题,所以我正在使用:System.setProperty("java.net.preferIPv4Stack", "true"); 除了 Firefox (16.0.2) 之外的所有浏览器都可以工作。【参考方案7】:

我们测试了 Windows 修补程序 http://support.microsoft.com/kb/2754804 并确认它确实解决了问题。

【讨论】:

此修补程序是否也解决了 Windows Vista 的问题?它未在先决条件中列出。 我们没有在 Vista 上测试过这个【参考方案8】:

其实windows 7上JDK7下的TFTP也有同样的问题,MS hotfix确实解决了FTP问题,但还是不能对TFTP起作用。似乎 Oracle 应该向 MS 报告同样的问题并获得另一个修补程序来解决 TFTP 问题。

【讨论】:

【参考方案9】:

我在使用 IDE Eclipse Neon、JAVA 7 和 Windows 7 Professional 时遇到了同样的问题。尝试将 PDF 文件上传到 FTP 服务器。我通过以管理员身份在 CMD 中运行以下命令解决了这个问题:

C: \ Users \ pc01> netsh advfirewall set global StatefulFTP disable

【讨论】:

堆栈溢出requires that all posts be in English。我编辑了您的帖子以遵守此规则。有特定语言的 Stack Overflow 社区允许使用非英语:Spanish、Japanese、Russian、Portuguese。

以上是关于如果防火墙打开,Java 7 会阻止 Windows Vista 和 7 上的 FTP 传输。有任何想法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何添加规则以阻止 chrome 或 firefox 等程序使用 Window 防火墙或 netsh advfirewall-C# 访问任何 IP 地址?

怎样解除被防火墙阻止运行的程序

由于无法验证发布者 所以windows已经阻止此软件

怎样关闭IE浏览器防火墙

应用程序被java安全阻止怎么办

window.open() 某些情况会被浏览器阻止弹出窗口及解决办法