我正在使用一个HttpsUrlConnection
通过使用基本身份验证Authenticator
并设置默认值Authenticator
像这样的对象:
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "userpass"
.toCharArray());
}
});
当我访问我的网络服务时,连接会调用我的getPasswordAuthentication()
方法获取凭据并将其发送到 Web 服务器。只要密码正确,就可以正常工作。 :)
然而,恰巧有人更改了网络服务器上的基本身份验证密码,然后我的请求没有返回。
我调试了它,发生的事情是我的电话getInputStream()
永远不会回来。这HttpsUrlConnection
确实收到 401 响应,并通过再次获取相同的凭据来对此做出内部反应。但由于我只提供了一个用户和密码,这将再次失败(一次又一次......)。
所以我的问题是:我怎样才能防止这种情况发生,哪里有一个钩子可以对错误的密码(分别是 401 响应)做出反应,以便我可以显示适当的错误消息并取消请求?
以下是重复调用的方法的堆栈跟踪摘录HttpsUrlConnection
:
1: MyOwnHttpConnection$3.getPasswordAuthentication() line: 99
2: Authenticator.requestPasswordAuthentication(InetAddress, int, String, String, String) line: 162
3: HttpsURLConnectionImpl$HttpsEngine(HttpURLConnectionImpl).getAuthorizationCredentials(String) line: 1205
4: HttpsURLConnectionImpl$HttpsEngine(HttpURLConnectionImpl).processAuthHeader(String, String) line: 1178
5: HttpsURLConnectionImpl$HttpsEngine(HttpURLConnectionImpl).processResponseHeaders() line: 1118
6: HttpsURLConnectionImpl$HttpsEngine(HttpURLConnectionImpl).retrieveResponse() line: 1044
7: HttpsURLConnectionImpl$HttpsEngine(HttpURLConnectionImpl).getInputStream() line: 523
8: HttpsURLConnectionImpl.getInputStream() line: 283