为什么需要抢先身份验证?
System.setProperty(“httpclient.authentication.preemptive”,“true”);
我在java中编写了Web服务访问客户端程序。我们在调用对象中设置用户名和密码,并且工作正常。
最近,我们的服务提供商在他们身边做了一些更改,之后他们没有收到用户名& Web服务调用中的密码,因为他们没有收到用户名& passwod所以我们无法连接到他们的(提供商)服务。
然后我用Google搜索并发现了抢占式身份验证。 在调用Web服务时,我们将“httpclient.authentication.preemptive”设置为“true” - System.setProperty(“httpclient.authentication.preemptive”,“true”); ,然后我们就可以收到服务提供商的回复。
当我们删除System.setProperty(“httpclient.authentication.preemptive”,“true”)时;然后我们无法连接到他们的服务。
答案 0 :(得分:1)
当我们更改传输pivot =“ java:org.apache.axis.transport.http.HTTPSender ”到传输pivot =“ java:org。 client-config.wsdd文件中的apache.axis.transport.http.CommonsHTTPSender “。无需设置System.setProperty(“httpclient.authentication.preemptive”,“true”)即可解决此问题;
client-config.wsdd -
<?xml version="1.0" encoding="UTF-8"?>
<deployment
name="commonsHTTPConfig"
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<!-- use CommonsHTTPSender instead of the default HTTPSender -->
<transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" />
<transport name="local" pivot = "java:org.apache.axis.transport.local.LocalSender" />
<transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" />
</deployment>
答案 1 :(得分:1)
以下是常规身份验证的工作原理(又称为抢先身份验证-例如Curl的工作方式):
Authorization: Basic dXNlcjpwYXNz
以下是非抢先身份验证的工作原理(例如Apache的HttpClient的工作方式):
WWW-Authenticate: Basic realm="Default Realm"
Authorization: Basic dXNlcjpwYXNz
为什么要使用第二种方法?它确保只有需要身份验证的服务器才能获得您的密码。但这确实意味着服务器必须以正确的方式响应(WWW-Authenticate
标头)。也许这就是您遇到的麻烦,以及为什么您必须重写HTTP客户端以强制执行抢先式身份验证。
((如果您想更好地了解客户端和服务器之间实际发生的情况,建议使用Wireshark。您可以在此处阅读有关Apache HTTP客户端的文档,主题为http://hc.apache.org/httpclient-3.x/authentication.html))< / p>