2011-12-29 13 views
6

私は負荷のRSSは、リモートのURLからのフィードこと、Tomcatの6で実行されている、のJava Webアプリケーションを持っています。Javaプロキシ認証

私は私のためにRSSフィードと異なるフォーマットを処理するためにRomeを使用しています。

try{ 
    feedSource = new URL(rssObject.getAsset()); 
}catch(MalformedURLException mue){ 
    logger.error(...); 
    throw mue; 
} 

try{ 
    URLConnection connection = feedSource.openConnection(); 
    feed = new SyndFeedInput().build(new XmlReader(connection)); 
}catch(Exception){handle...} 

この新しいクライアントでは、プロキシを使用する場合を除いて、コードは正常に動作します。

プロキシを使用するために、私ははhttp.proxyHostとproxyPortのシステムプロパティを設定します。

System.setProperty("http.proxyHost", proxyHost); 
System.setProperty("http.proxyPort", proxyPort); 
System.setProperty("https.proxyHost", proxyHost); 
System.setProperty("https.proxyPort", proxyPort); 

HTTP GETは、プロキシ無事に行われたが、今は、HTTP 502エラー(悪いゲートウェイを取得するか、または似たような)。

WiresharkとのHTTP交換を分析すると、私はプロキシが認証を要求していることに気付きました。これは、HTTP 507 Javaが何らかの形で認証しようとしているが、それは間違ったユーザー名とパスワードを使用しています送信します。私は知らないパスワードのように、ホスト名をユーザー名として使うようです。

だから私は、ユーザー名+パスワードを指定する認証方式を実装してみました:

Authenticator.setDefault(new Authenticator() { 
      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       logger.info(MessageFormat.format("Generating PasswordAuthentitcation for proxy authentication, using username={0} and password={1}.", username, password)); 
       return new PasswordAuthentication(username, password.toCharArray()); 
      } 
     }); 

今私の問題は、それが無視されていることです。 getPasswordAuthenticationメソッドは決して呼び出されません。私は、ログファイルにログ文を参照してください、私はそれはまだユーザー名としてホスト名を使用していることがわかりますWiresharkのを使用しないでください。

なぜですか?それは、Javaが何らかの形で認証者に相談せずにそれ自身で認証しようとしているようです。

プロキシは、認証にNTLMを使用してMS装置であると思われます。これを処理するためのjavaにはいくつかの組み込みのメカニズムがありますか?アプリケーションを実行するマシンは、Windows Server 2008 R2です。

答えて

12

ここでは、NTLMベースのプロキシでの認証で同じことを行いました。

実際には、プロキシの認証は通常HTTP基本認証です。つまり、一緒にプロキシJVM設定で

protected URLConnection newURLConnection(URL pURL) throws IOException { 
    URLConnection urlConnection = super.newURLConnection(pURL); 

    String auth = new String(Base64.base64Encode(new String("username:password").getBytes())); 
    auth = "Basic " + auth; 
    urlConnection.setRequestProperty("Proxy-Connection","Keep-Alive"); 
    urlConnection.setRequestProperty("Proxy-Authorization",auth); 
    return urlConnection; 
} 

トリックをした:

我々は、次の方法を使用していました。

http://en.wikipedia.org/wiki/Basic_access_authenticationを参照してください。

+0

どうもありがとうございました。それも私たちのために働く。 –