Android: HttpsUrlConnection with Authenticator for Basic Authentication iterates forever when password is wrong (on 401 response)

后端 未结 2 814
再見小時候
再見小時候 2020-12-31 10:46

I am using an HttpsUrlConnection with Basic Authentication by using an Authenticator and setting a default Authenticator object like t

2条回答
  •  执念已碎
    2020-12-31 11:12

    I solved this problem by abstracting request/response logic away into a MyRequest class. This allows me to have a request-scoped variable that can tell my Authenticator whether it should make a request using a specified username and password, or whether it should stop retrying (by returning null). It looks somewhat like the following (consider this pseudocode)

    public class MyRequest
    {
        private boolean alreadyTriedAuthenticating = false;
        private URL url;
    
        ...
    
        public void send()
        {
            HttpUrlConnection connection = (HttpUrlConnection) url.openConnection();
            Authenticator.setDefault(new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    if (!alreadyTriedAuthenticating)
                    {
                        alreadyTriedAuthenticating = true;
                        return new PasswordAuthentication(username, password.toCharArray());
                    }
                    else
                    {
                        return null;
                    }
                }
                InputStream in = new BufferedInputStream(connection.getInputStream());
    
                ...
    
        }
    }
    

提交回复
热议问题