抢先认证为什么

时间:2011-09-20 08:55:33

标签: java authentication http-headers httprequest preemptive

为什么需要抢先身份验证?

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”)时;然后我们无法连接到他们的服务。

2 个答案:

答案 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的工作方式):

  • 用户指示客户向http://user:pass@example.com发送请求
  • 客户端发出带有以下标题的请求:Authorization: Basic dXNlcjpwYXNz
  • 服务器使用200验证用户身份并进行响应

以下是非抢先身份验证的工作原理(例如Apache的HttpClient的工作方式):

  • 用户指示客户向http://user:pass@example.com发送请求
  • 客户端发出未经身份验证的请求
  • 服务器响应时显示401和标头,例如:WWW-Authenticate: Basic realm="Default Realm"
  • 客户端发出第二个请求,其标题为:Authorization: Basic dXNlcjpwYXNz
  • 服务器使用200验证用户身份并进行响应

为什么要使用第二种方法?它确保只有需要身份验证的服务器才能获得您的密码。但这确实意味着服务器必须以正确的方式响应(WWW-Authenticate标头)。也许这就是您遇到的麻烦,以及为什么您必须重写HTTP客户端以强制执行抢先式身份验证。

((如果您想更好地了解客户端和服务器之间实际发生的情况,建议使用Wireshark。您可以在此处阅读有关Apache HTTP客户端的文档,主题为http://hc.apache.org/httpclient-3.x/authentication.html))< / p>