У меня есть простое 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();
}
Это проблема на сервере, а не на этом клиентском коде, если в авторизации нет чего-то неправильного. – EJP
@EJP Это оказалось проблемой с аутентификацией. Конкретный URL-адрес, который я использовал, требует другого пароля. Удаленный сервер никогда не отправлял обратно 401 или 403, что я и ожидал. Если вы хотите опубликовать свой комментарий в качестве ответа, я буду рад отметить его правильно. – user1071914