我正在使用HttpsUrlConnection
进行基本身份验证,方法是使用Authenticator
并设置一个默认的Authenticator
对象,代码如下:
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "userpass"
.toCharArray());
}
});
当我访问我的 Web 服务时,连接调用我的 getPasswordAuthentication()
方法获取凭据并将其发送到 Web 服务器。只要密码正确,这就可以正常工作。 :)但是,有人更改了 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