2016-11-27 12 views
0

私はシンプルなファイアウォールとして機能するTomcatベースのJavaアプリケーションを持っています。「外部」からリクエストを受け取り、「内部」のリソースにルーティングし、その結果を「外部」に返します。リダイレクトが多すぎるため、JavaでHTTP接続が失敗しますか?

これはGETでうまく動作しますが、別の要求に対してPOST関数を追加しようとしていますが、動作させることができません。 "内部"のリモートサーバーはパスワードで保護されているため、リモートサーバーに認証資格情報を受け入れることができません(GETのために動作し、資格情報は正常です)。代わりに、Tomcatサーバーは認証者を何度も呼び出し、最後に失敗します。ここで私が取得していますエラー:

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を返す予定でしたが、これが起こったことはありませんでした。代わりに、この "リダイレクト"が発生しました。 Javaコードからパスワードで保護されたURLを使用しようとしている場合、これは注意する必要があります。

関連する問題