我目前正在测试一个Web应用程序,并遇到了一个有趣的现象。在我的测试会话期间,我使用代理收集了URL。现在我想测试我的URL列表以进行匿名访问,所以我写了这个小工具
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 + login dlg。 Internet Exploder在后台执行NTLM身份验证并授予访问权限。似乎Java URLConnection(或URL)类做了同样的事情,因为我没有得到401.有没有办法在Java中禁用隐式NTLM身份验证?这对我来说是一个不好的陷阱。
答案 0 :(得分:1)
我认为Java Network Documentation是最好的资源。设置http.auth.preference="basic"
可以获得您想要的效果。假设你不需要消化或其他东西。我不确定你是否可以超越它来禁用NTLM。
另一件需要考虑的事情是其他Java HTTP客户端实现,如Apache或Google。
答案 1 :(得分:0)
我不确定这会有所帮助,但我却被相反的情况所困扰。
我想要 NTLM auth发生,所以在我的本地机器上我使用一个名为CNTLM的免费应用程序。它是一个本地代理服务器,它将转发(和NT auth)传入的请求。适用于无法使用NTLM代理的应用程序。
对不起,我知道这不是回答你的问题,但也许对那里的人有帮助! :)