在Windows计算机上访问Web浏览器中的以下JSON URL很简单,因为这会弹出一个验证框,询问用户名和密码,输入时会正确显示JSON数据。
www.json-behind-ntlm-authentication.com/view-data
我现在正试图将其转移到Java Servlet中。
我已经测试了HttpClient库http://hc.apache.org,并且我从他们的文档中尝试过的每个示例都不起作用。我尝试过的大多数代码甚至都没有正确编译。
我还测试了Jsoup,https://jsoup.org/,因为这是一个非常好的Web抓取库,但这似乎不支持访问NTLM身份验证背后的页面。
我还测试了这里找到的代码https://blogs.msdn.microsoft.com/freddyk/2010/01/19/connecting-to-nav-web-services-from-java/,这是我能找到的唯一一个与访问NTLM身份验证后面的JSON URL相关的代码示例。这实际上是我想要实现的,一个通过Web服务访问Microsoft Nav数据的Java Web应用程序 - 甚至这个官方示例也无法编译。
任何指针/选项?某个地方必须有一个Java库才能解决这个问题?访问当前是通过HTTP进行的,但出于安全原因最终将通过SSL进行访问,因此任何解决方案都必须支持SSL握手。
我真的不想使用LINQ https://blogs.msdn.microsoft.com/freddyk/2009/04/20/using-linq-with-nav-web-services/来构建一个单独的C#应用程序,我希望它可以工作,但是我不希望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));
我仍然不确定如何真正解决这个问题。还有其他指示吗?
答案 0 :(得分:0)
org.apache.http.auth
有NTCredentials
您可以在HttpComponentsMessageSender
的春季启动中使用@Configuration
HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender(); NTCredentials凭据=新的NTCredentials(“用户名”,“密码”,null,“域”);