FailingHttpStatusCodeException:401使用HtmlUnit进行未经授权的访问

时间:2017-03-29 18:11:34

标签: java http webclient htmlunit

我尝试使用此代码使用HtmlUnit连接到页面:

WebClient webClient = new WebClient();
webClient.getOptions().setThrowExceptionOnScriptError(false);
HtmlPage loginPage = webClient.getPage(WEBSPHERE_URL);

但我总是收到这个错误:

18:06:00,390 ERROR [stderr] (Refresh Thread: Equinox Container: 90609616-a614-0017-138e-e6e4aa4a0871) com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException: 401 Unauthorized for https://portal-intranet.ti.sabesp.com.br/wps/myportal
18:06:00,390 ERROR [stderr] (Refresh Thread: Equinox Container: 90609616-a614-0017-138e-e6e4aa4a0871)   at com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java:576)
18:06:00,390 ERROR [stderr] (Refresh Thread: Equinox Container: 90609616-a614-0017-138e-e6e4aa4a0871)   at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:401)

当我尝试使用浏览器访问URL时,它运行正常。我该怎么做才能解决这个问题?

更新

现在我收到了这个错误:

21:43:35,746 ERROR [osgi.logging.setup_environment] (Thread-257) [br.com.sabesp.setupenvironment.portlet.SetupEnvironmentAction(2427)] The activate method has thrown an exception : java.lang.LinkageError: loader constraint violation: when resolving method "com.gargoylesoftware.htmlunit.WebClient.setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V" the class loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) of the current class, br/com/sabesp/setupenvironment/importer/util/WebContentUtil, and the class loader (instance of org/eclipse/osgi/internal/loader/EquinoxClassLoader) for the method's defining class, com/gargoylesoftware/htmlunit/WebClient, have different Class objects for the type org/apache/http/client/CredentialsProvider used in the signature

当我尝试这样做时:

DefaultCredentialsProvider userCredentials = new DefaultCredentialsProvider();
userCredentials.addCredentials("username", "password");
webClient.setCredentialsProvider(userCredentials);

我正在使用Liferay DXP女巫基于OSGi框架,我也使用Gradle。

1 个答案:

答案 0 :(得分:0)

您似乎是针对Intranet网站运行的,这可以从浏览器中检测您的用户名。

使用HtmlUnit,您可以使用NTLM身份验证:

DefaultCredentialsProvider credentialsProvider =
                (DefaultCredentialsProvider) webClient.getCredentialsProvider();
credentialsProvider.addCredentials("username", "password");
//OR
credentialsProvider.addNTLMCredentials("username", "password", null, -1, "localhost", "domain");

您还可以启用流量记录以查看所需的身份验证类型:

LogManager.getLogger("org.apache.http.wire").setLevel(Level.ALL);

更新:

您似乎有相互冲突的httpclient罐子,请删除其中一个。

以下代码将告诉您正在使用哪一个:

System.out.println(CredentialsProvider.class.getProtectionDomain()
    .getCodeSource().getLocation());