2009-06-26 32 views
0

NTLM認証を必要とするIIS Webサイトに接続するJavaクラスを作成しました。 Javaクラスは、JCIFSライブラリを使用し、次の例に基づいています。JCIFS NTLM GlassFish(またはサーブレットコンテナ)上のHTTP接続の認証

Config.registerSmbURLHandler(); 
Config.setProperty("jcifs.smb.client.domain", domain); 
Config.setProperty("jcifs.smb.client.username", user); 
Config.setProperty("jcifs.smb.client.password", password); 

URL url = new URL(location); 
BufferedReader reader = new BufferedReader(
      new InputStreamReader(url.openStream())); 
String line; 
while ((line = reader.readLine()) != null) { 
    System.out.println(line); 
} 

の例では、できるだけ早く私は、特にサーブレットコンテナ(で同じコードを使用しようとして、コマンドプロンプトから実行すると正常に動作しますが、 GlassFish)、私はIOExceptionに "Server returned HTTP response code:401 for URL:...."というメッセージを含んでいます。

私はjcifs jarをシステムクラスパス(%GLASSFISH%/ lib)に移動しようとしましたが、それは違いはありません。

提案が高く評価されます。

答えて

3

私は何をしようとしていたことは、すでにJavaの5/6でサポートされていると私はそのためJCIFSのAPIを削除し、代わりにこのような何かを行うことができたようです:

public static String getResponse(final ConnectionSettings settings, 
     String request) throws IOException { 

    String url = settings.getUrl() + "/" + request; 

    Authenticator.setDefault(new Authenticator() { 
     @Override 
     public PasswordAuthentication getPasswordAuthentication() { 
      System.out.println(getRequestingScheme() + " authentication") 
      // Remember to include the NT domain in the username 
      return new PasswordAuthentication(settings.getDomain() + "\\" + 
       settings.getUsername(), settings.getPassword().toCharArray()); 
     } 
    }); 

    URL urlRequest = new URL(url); 
    HttpURLConnection conn = (HttpURLConnection) urlRequest.openConnection(); 
    conn.setDoOutput(true); 
    conn.setDoInput(true); 
    conn.setRequestMethod("GET"); 

    StringBuilder response = new StringBuilder(); 
    InputStream stream = conn.getInputStream(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(stream)); 
    String str = ""; 
    while ((str = in.readLine()) != null) { 
     response.append(str); 
    } 
    in.close(); 

    return response.toString(); 
} 
+0

あなたはfuc *** ngの天才です。私の日を救った。わたしは、あなたを愛しています。 –

+0

スレッドセーフではありません--- Authenticator.setDefault()は_global_ authenticatorオブジェクトを設定します... –

0

JCIFSのようなサウンドは、Glassfishの内部でURLを処理するための工場を設定する権利がありません。ポリシー設定(checkSetFactory)をチェックする必要があります。

Config#registerSmbURLHandler()によってSecurityExceptionが発生する可能性があります。

+0

それはのは、任意の例外のように見えるのdoesn Config#registerSmbURLHandler()(出典:http://jcifs.samba.org/src/src/jcifs/Config.java)では、java.protocol.handler.pkgsプロパティーがjcifsに設定されているため、これを飲み込んでいます。私はGlassFishのJVMオプションにプロパティを追加しようとしましたが、運が無かった。 –

+0

JCIFSはURLStreamHandlerを登録します。これはConfigクラス内では行われません。下位パッケージ内のトランスポート実装を調べる必要があります。だからそれはまだセキュリティ上の問題である可能性があります。 – cafebabe

関連する問題