在 Windows 机器上从 Web 浏览器中访问以下 JSON URL 很简单,因为这会弹出一个身份验证框,要求输入用户名和密码,输入时正确显示 JSON 数据。
www.json-behind-ntlm-authentication.com/view-data
我现在正试图将它移动到 Java Servlet 中。
我已经测试了 HttpClient 库http://hc.apache.org,并且我从他们的文档中尝试过的每个示例都不起作用。我尝试过的大多数代码甚至都无法正确编译。
我还测试了 Jsoup,https: //jsoup.org/,因为这是一个非常好的网络抓取库,但这似乎不支持访问 NTLM 身份验证后面的页面。
我还测试了这里找到的代码,https://blogs.msdn.microsoft.com/freddyk/2010/01/19/connecting-to-nav-web-services-from-java/,这是唯一的代码示例我可以找到与访问位于 NTLM 身份验证后面的 JSON URL 相关的内容。这实际上是我想要实现的,一个 Java Web 应用程序通过他们的 Web 服务访问 Microsoft Nav 数据——甚至这个官方示例也无法编译。
任何指针/选项?一定有一个Java库可以解决这个问题吗?访问目前通过 HTTP,但出于安全原因最终将通过 SSL,因此任何解决方案都必须支持 SSL 握手。
我真的不想使用 LINQ 构建单独的 C# 应用程序,https: //blogs.msdn.microsoft.com/freddyk/2009/04/20/using-linq-with-nav-web-services/ ,我会希望有效,但我不希望 C# 示例基于未编译的 Java 示例在这种情况下工作。
更新
经过大量搜索后,我发现下面的代码似乎接近工作,但并不完全正常 - 请参阅代码中出现问题的注释。感谢评论中的指示。
DefaultHttpClient httpclient = new DefaultHttpClient();
List<String> authpref = new ArrayList<String>();
authpref.add(AuthPolicy.NTLM);
httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, authpref); //ERROR - This causes an error: java.lang.VerifyError: Cannot inherit from final class
NTCredentials creds = new NTCredentials(username, password, "", domain);
httpclient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
HttpHost target = new HttpHost(baseURL);
// Make sure the same context is used to execute logically related requests
HttpContext localContext = new BasicHttpContext();
// Execute a cheap method first. This will trigger NTLM authentication
HttpGet httpget = new HttpGet(baseURL);
HttpResponse response1 = httpclient.execute(target, httpget, localContext); //ERROR - This line is throwing an error: java.lang.VerifyError: Cannot inherit from final class
HttpEntity entity = response1.getEntity();
System.out.println(EntityUtils.toString(entity));
我仍然不确定如何实际解决这个问题。任何额外的指针?