java - Java\Groovy - java.io.IOException:简单的经过身份验证的 HTTP 请求中的身份验证失败
问题描述
我正在使用 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)
...
我们还能尝试检查什么?
解决方案
使用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 请求的博文,您可能想查看一下。
推荐阅读
- python - ImportError: 无法从 '__main__' 导入名称 'views' (C:\Users\Kalyan Mohanty\Documents\GitHub\Django\rek\calc\urls.py)
- python - 在为 csv 文件编码时:ValueError:一个系列的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
- python - 在等号后插入换行符在python3.8中自我记录f字符串
- rust - 这是按值捕获字符串的正确方法吗?
- javascript - 如何单击 SVG 以激活父网页中的功能
- html - 导航栏中文本上方的下拉箭头
- django - django+react 应用部署到 Heroku 时 TemplateDoesNotExist at / index.html 出错
- sql - 修改时间戳并选择当前日期
- python - Pandas 多列比较
- java - 查找给定的数字是否是完全平方?