Search code examples
dockerhttpsjava-8tomcat9authenticator

Java Authenticator "Server redirected too many times" from Tomcat9/JDK8 in Docker container


I am downloading a pdf file from a fixed URL(for testing) which is a Sharepoint list.When running the code on a standalone VM based tomcat9 ,its showing the pdf but if running same working code from Docker based tomcat9,then its giving Server redirected too many times (20). Below is the code segment-

String attachtmentname = "https://<full url>";
String file_name = "<file>.pdf";
String Userid = "<some id>";
String password = "<some password>";
response.setHeader("Content-type", "application/pdf");
response.setHeader("ReportPDF", "content-description");
response.setHeader("Content-Disposition", "inline; filename=" + file_name);
response.setHeader("Cache-Control", "cache,must-revalidate");
System.setProperty("http.proxyUser", Userid);
System.setProperty("http.proxyPassword", password);
Authenticator.setDefault(new Authenticator() {
            
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(Userid, password.toCharArray());
                }
            });
            CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));
BufferedInputStream in = new BufferedInputStream(new URL(attachtmentname).openStream());
<rest of the code for reading pdf file>

Getting "Server redirected too many times (20)" error

java.net.ProtocolException: Server redirected too many  times (20)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1908)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1498)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:268)
    at java.net.URL.openStream(URL.java:1068)

Solution

  • Got it working using Java nio library.Below is the test code ,if it helps someone.

    String attachtmentname = "https://full url/somefile.pdf";
    String Userid = "domain\\username";
    String password = "password"; 
    
            Authenticator.setDefault(new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(Userid, password.toCharArray());
                    }
                });
    URL url = new URL(attachtmentname);
    try (InputStream in = url.openStream()) {
        Path pwd = Paths.get("Somepath\\someFile1.pdf").toAbsolutePath();
        out.println(pwd);
        
      Files.copy(in, pwd, StandardCopyOption.REPLACE_EXISTING);
    } catch (Exception e) {
       e.printStackTrace();
    }