Groovy/Java HTTP认证失败问题:代码仅同事电脑无法运行
解决HTTP GET下载文件时的Authentication failure问题
嘿,这个问题我之前帮同事排查过类似的情况,咱们从代码和环境两方面来梳理解决方案:
首先看代码本身的问题:认证时机不对
你原来的代码是先调用了openConnection(),之后才设置默认的Authenticator——这时候连接可能已经发起了认证请求,Authenticator还没生效就被拒绝了。其他电脑可能因为缓存或者环境宽松没触发这个问题,但同事的电脑刚好对认证时机更敏感。
修正后的代码(调整顺序+安全优化):
// 先设置认证器,再打开连接 Authenticator.setDefault(new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { // 推荐用char数组存储密码,比字符串更安全 return new PasswordAuthentication(USER, PASSWORD.toCharArray()); } }); new File(fullFilePath).withOutputStream { out -> def urlConnection = new URL(COMPLETE_URL).openConnection() out << urlConnection.inputStream }
然后排查同事电脑的环境问题
如果调整代码顺序后还是不行,大概率是同事的电脑环境有特殊配置:
检查代理设置:很多公司网络会强制使用代理,同事的电脑可能自动启用了系统代理,而代理需要额外认证,或者代理地址和你们的不一致。可以在代码里临时关闭代理测试:
// 在打开连接前添加这几行,禁用代理 System.setProperty("http.proxyHost", "") System.setProperty("http.proxyPort", "") System.setProperty("https.proxyHost", "") System.setProperty("https.proxyPort", "")验证认证方式是否匹配:如果服务器用的是Digest认证,默认的Authenticator可能处理不了,这时候可以手动构造Authorization请求头:
def authString = "${USER}:${PASSWORD}".bytes.encodeBase64().toString() urlConnection.setRequestProperty("Authorization", "Basic ${authString}")清空系统认证缓存:同事的电脑可能之前保存了错误的凭据,导致新的认证请求被缓存覆盖。可以让同事在系统设置里清空HTTP认证缓存,或者在代码里禁用连接缓存:
urlConnection.setUseCaches(false) urlConnection.setDefaultUseCaches(false)
内容的提问来源于stack exchange,提问作者user3804769
相关产品推荐
相关产品推荐

