我正在使用Groovy \ Java。我正在尝试使用简单的HTTP GET从服务器下载文件。这段代码适用于我们尝试的每台计算机,但我的同事的计算机除外。
new File(fullFilePath).withOutputStream { out ->
url = new URL(COMPLETE_URL).openConnection()
Authenticator.setDefault (new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (USER, PASSWORD);
}
});
out << url.inputStream
}
奇怪的是,此代码在我的计算机和AWS实例上,在Windows 10和Windows Server 2012上完美运行,并且在Windows 10上无法在我的同事的计算机上运行。所有64位。
我们都有相同的Java版本。防病毒和防火墙已禁用。我尝试了他的凭据,他尝试了我的,但它仍然不能只用他的电脑。
错误:
java.io.IOException: Authentication failure
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1695)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
...
我们还可以尝试检查什么?
答案 0 :(得分:0)
使用Authenticator.setDefault()
对此不利。它将导致Java在JVM发出请求凭据的任何请求上发送您的用户名和密码。
为什么这只在一台机器上失败很难说,但Java配置可能必须不同。
在任何情况下,请尝试将代码更改为仅在每个请求上设置身份验证标头。这将使您的代码减少对Java内部的依赖,并且不会仅仅在JVM可能在将来发出的每个请求上发送您的凭据:
def authHeaderValue = 'Basic ' + Base64.encoder.encodeToString("$USER:$PASSWORD".bytes)
new File(fullFilePath).withOutputStream { out ->
connection = new URL(COMPLETE_URL).openConnection()
connection.setRequestProperty('Authorization', authHeaderValue)
out << connection.inputStream
}
我写了一篇关于在没有库的情况下在Groovy中发出HTTP请求的blog post,你可能想要查看它。