2011-07-26 6 views
2

プロキシ認証を統合したMicrosoft ISA Serverの背後にあるアプレットです.Isaプロキシサーバーは、認証資格情報を持たない接続に対してhttp 405(NOT 407) 。私のjava.net.Authenticatorクラスは呼び出されません。 この場合、プロキシサーバーへの接続をどのように認証できますか?

アプレットに署名され、java1.6でコンパイルされます。 URLConnectionクラスが接続に使用されます。認証を必要とするプロキシの背後にhttp接続をオープンしていますが、407を返しません。

+0

HttpURLConnectionに直接アクセスできますか、他のライブラリ経由ですか? – laz

+0

@laz:はい私はそれにアクセスできます。アプローチ1では – e13420xx

答えて

2

この問題を回避するには2つの方法があり、どちらも理想的ではありません。まず、認可情報でリクエストを送信しても405のレスポンスコードが返されないことを確認したと思いますか?答えがイエスである場合は、ヘッダーとして要求にProxy-authorizationヘッダーを設定してみてくださいすることができます

URL url = new URL("http://location"); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("Proxy-authorization", authorizationValue); 

そのヘッダのフォーマットは、プロキシサーバが必要とされる許可方式に依存するので、あなたはよあなたの特定のシナリオについていくつかの調査をしなければなりません。

2番目のアプローチでは、応答コードをスプーフィングして通常のプロキシ認証パスを強制する内部JDKクラスをサブクラス化します。それは予期しない結果をもたらすことができるように

public class HttpURLConnection extends sun.net.www.protocol.http.HttpURLConnection { 

    @Override 
    public int getResponseCode() throws IOException { 
     int code = super.getResponseCode(); 
     if (code == HTTP_BAD_METHOD) { 
      code = HTTP_PROXY_AUTH; 
      responseCode = code; 
     } 
     return code; 
    } 

} 

はもちろん、これは実際の405応答をマスクします:まず、ここでのサブクラスです。これを使用するようにURLオブジェクトを伝えることはjava.net.URLStreamHandlerFactoryのサブクラスを必要とします。

public class URLStreamHandlerFactory extends java.net.URLStreamHandlerFactory { 
    @Override 
    URLStreamHandler createURLStreamHandler(String protocol) { 
     if (!protocol.equals("http")) { 
      return null; 
     } else { 
      return new java.net.URLStreamHandler { 
       protected String proxy; 
       protected int proxyPort; 

       public Handler() { 
        proxy = null; 
        proxyPort = -1; 
       } 

       public Handler (String proxy, int port) { 
        this.proxy = proxy; 
        this.proxyPort = port; 
       } 

       @Override 
       protected java.net.URLConnection openConnection(URL u) throws IOException { 
         return openConnection(u, (Proxy)null); 
       } 

       @Override 
       protected java.net.URLConnection openConnection(URL u, Proxy p) throws IOException { 
         return new HttpURLConnection(u, p, this); 
       } 

       @Override 
       protected int getDefaultPort() { 
        return 80; 
       } 

      } 
     } 
    } 
} 

その後、あなたは初期化コードでURL.setURLStreamHandlerFactory(new URLStreamHandlerFactory());どこかを呼び出すことにより、このオブジェクトを使用することができます。私はthis sitethis siteがコアJavaクラスの仕組みを調べるのに役立つことを発見しました。 HTTPSをサポートする必要がある場合は、そのプロトコルに同様の変更を加える必要があります。

うまくいけば、これらの解決策の1つがあなたに役立つことを望みます。後者のアプローチがアプレットのセキュリティ制約の中で機能することは完全にはわかりません。前者はすべきだ。 Apache HttpComponentsなどの別のHTTPライブラリを使用する方が簡単な場合もあります。

+0

がヘッダーに代理承認されますか?またはプロキシ認証ヘッダー?認証プロトコルは時々(ntlmまたはkerberos)異なるので、このアプローチは非常に難しいと思いますか?アプローチ2で:レスポンスコードの設定で十分でしょうか?私はまた、必要な認証の種類についていくつかのヘッダーを設定する必要があると思いますか? – e13420xx

+0

それをAproachは 'Proxy-authorization'になります。スキームが変化しているのなら、それは非常に難しいようです。したがって、 '405'が返されますが、どのタイプの認証が必要なのでしょうか?その場合は、必要な 'Proxy-Authenticate'レスポンスヘッダも含める必要があります。プロキシサーバーが誤って構成されていますか?これは重大な壊れた動作のように聞こえる!サーバーはブラウザなどの何かで正しく動作しますか? – laz

+0

なぜ彼らはそれをそういう形にしたのかわからないが、彼らがしたことはそうだ。そのネットワークのクライアントは、ほとんどローカルにブラウズしているウェブにアクセスすることが非常に制限されています。明らかに、クライアント側でこの問題を解決するために問題が起きる可能性があるため、変更できません。 – e13420xx

関連する問題