2

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

アプレットは java1.6 で署名およびコンパイルされています。URLConnectionクラスは接続に使用されます。

4

1 に答える 1

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());次に、初期化コードのどこかを呼び出すことで、このオブジェクトを使用できます。このサイトこのサイトは、コア Java クラスがどのように機能するかを調べるのに役立ちます。HTTPS をサポートする必要がある場合は、そのプロトコルに同様の変更を加える必要があります。

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

于 2011-07-26T16:24:35.220 に答える