2012-05-25 139 views
1

我目前正在測試一個Web應用程序,並遇到了一個有趣的現象。在我的測試會話期間,我使用代理收集了URL。現在我想測試我的匿名訪問的URL列表,所以我寫了這個小工具在Java中抑制NTLM身份驗證

public static void main(String[] args) { 
    try { 
     TrustAllCerts.disableCertChecks(); 
     FileReader fr = new FileReader(new File("urls.txt")); 
     BufferedReader br = new BufferedReader(fr); 

     String urlStr = br.readLine(); 
     while (urlStr != null) { 
      if (urlStr.trim().length() > 0) { 
       URL url = new URL(urlStr); 

       HttpsURLConnection urlc = (HttpsURLConnection) url.openConnection(); 
       urlc.connect(); 
       if (urlc.getResponseCode() == HttpURLConnection.HTTP_OK) { 
        System.out.println(urlStr); 

       } else { 
        System.out.println("["+urlc.getResponseCode()+"] "+urlStr); 
       } 
       urlc.disconnect(); 
      } 
      urlStr = br.readLine(); 
     } 
     br.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

它基本上沒有什麼,但開在一個給定的URL的URL連接和測試HTTP響應代碼(其實我實現了一些更多的測試,如果我被重定向到登錄頁面)。但問題是,此特定應用程序(某些自定義MS SQL Server Reporting Services)配置爲使用NTLM WWW身份驗證。如果我嘗試訪問一些使用Firefox的URL,我會得到一個401 Unauthorized +登錄dlg。 Internet Exploder在後臺執行NTLM身份驗證並授予訪問權限。看起來,Java URLConnection(或URL)類的確如此,因爲我沒有得到401.有沒有辦法在Java中禁用隱式NTLM身份驗證?這對我來說是一個糟糕的陷阱。

回答

1

我認爲Java Network Documentation是最好的資源。設置http.auth.preference="basic"應該會得到你想要的。假設你不需要摘要或其他東西。我不確定您是否可以超越這個範圍來禁用NTLM。

要考慮的另一件事是其他Java HTTP客戶端實現,如Apache或Google的實現。

+0

嗨,感謝您*非常*快速回復。我只是測試了設置 - 不幸的是它不能解決我的問題。不過,非常感謝!我想我需要用Apache -.-中的HttpClient替換URLConnection。我想解決這個問題,因爲目前的解決方案非常快速而且很髒:)感謝您的努力! –

0

我不確定這會有所幫助,但我一直被相反的難住。

NTLM身份驗證的發生,所以我的本地計算機上我使用一個免費的應用程序稱爲CNTLM。它是一個本地代理服務器,它將轉發(和NT認證)傳入的請求。適用於無法使用NTLM代理的應用程序。

對不起,我知道這不是回答你的問題,但也許它證明對那裏的人有幫助! :)

+0

嘿,我在這裏使用Windows 7和JRE 1.6.0.22,而NTLM的作品(不幸)就像一個魅力。你可以嘗試使用我的代碼以上...也許它可以節省你一些麻煩! –

+0

我在這裏有第三次加入的經驗。我在Mac OS X上看起來似乎是使用NTLM進行回覆,但服務器拒絕迴應,然後提供NTLM和Basic作爲替代方案,這當然會導致無限循環。喜歡微軟遵守網絡標準。 :( – Trejkaz