2016-11-27 2 views
0

У меня есть простое Java-приложение на основе Tomcat, которое функционирует как своего рода брандмауэр - я беру запросы от «снаружи», перенаправляю их на ресурсы на «внутри» и возвращаю результат «снаружи».HTTP-соединение, выполненное в Java, не выполняется слишком много перенаправлений?

Это работает отлично для GET, но я пытаюсь добавить функцию POST для другого запроса, и я не могу заставить его работать. «Внутренний» удаленный сервер защищен паролем, и я не могу заставить удаленный сервер принимать учетные данные аутентификации (они работают для GET, поэтому учетные данные в порядке.) Вместо этого сервер Tomcat снова и снова вызывает Authenticator и, наконец, не работает. Вот ошибка я получаю:

java.net.ProtocolException: Server redirected too many times (20) 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1848) 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) 
     at com.mystuff.house.server.MyServlet.doPost(MyServlet.java:191) 

Я уверен, что я делаю что-то глупое, но я не могу видеть, где он находится. Вот внутренности сервлета doPost() рутина:

 URL url = new URL("HTTP", "10.10.1.101", -1, "/myresource"); 
     URLConnection con = url.openConnection(); 
     HttpURLConnection http = (HttpURLConnection) con; 
     http.setRequestMethod("POST"); 
     http.setDoOutput(true); 
     String encoded = String.valueOf(Base64.getEncoder().encode((a.getUsername().concat(":").concat(a.getPassword())).getBytes())); 
     http.setRequestProperty("Authorization", "Basic "+encoded); 
     http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 

     // Read the POST payload from the front end post, write to back end post 
     InputStream r = request.getInputStream(); 
     OutputStream os = http.getOutputStream(); 
     int j = 0; 
     while ((j = r.read()) != -1) { 
      os.write((byte) j); 
     } 

     http.connect(); 

     // Try reading the result from the back end, push it back to the front end 
     try { 
      InputStream i = http.getInputStream(); 
      OutputStream o = response.getOutputStream(); 

      // read/write bytes until EOF 
      j = 0; 
      while ((j = i.read()) != -1) { 
       o.write((byte) j); 
      } 
     } catch (Exception ex) { 
      System.out.println("AIEEEE! Error receiving page from HTTP call"); 
      ex.printStackTrace(); 
     } 
+0

Это проблема на сервере, а не на этом клиентском коде, если в авторизации нет чего-то неправильного. – EJP

+0

@EJP Это оказалось проблемой с аутентификацией. Конкретный URL-адрес, который я использовал, требует другого пароля. Удаленный сервер никогда не отправлял обратно 401 или 403, что я и ожидал. Если вы хотите опубликовать свой комментарий в качестве ответа, я буду рад отметить его правильно. – user1071914

ответ

0

Проблема с этим, после некоторого исследования, оказалось, что аутентификация не является действительным для конкретного URL, который я пытался попасть на пульте дистанционного управления сервер.

Я ожидал получить 403, 401 или 407 назад с удаленного сервера, но этого не произошло, вместо этого произошло это «перенаправление». Поэтому вам нужно знать, пытаетесь ли вы удалять URL-адреса, защищенные паролем, из кода Java.

Смежные вопросы