【问题标题】:preemptive authentication why抢先验证为什么
【发布时间】:2011-11-20 21:41:15
【问题描述】:

为什么需要抢先验证?

System.setProperty("httpclient.authentication.preemptive", "true");

我用java编写了Web服务访问客户端程序。我们在调用对象中设置用户名和密码的地方,效果很好。

最近,我们的服务提供商在他们身边进行了一些更改,之后他们在网络服务调用中没有收到用户名和密码,并且由于他们没有收到用户名和密码,所以我们无法连接到他们的(提供商)服务.

然后我进行了谷歌搜索,发现了关于抢先式身份验证的信息。 在调用 Web 服务时,我们将 "httpclient.authentication.preemptive" 设置为 "true" - System.setProperty("httpclient.authentication.preemptive", "true"); ,然后我们就能够收到来自服务提供商的响应。

当我们移除 System.setProperty("httpclient.authentication.preemptive", "true");那么我们就无法连接到他们的服务。

【问题讨论】:

    标签: java authentication http-headers httprequest preemptive


    【解决方案1】:

    当我们将 transport pivot="java:org.apache.axis.transport.http.HTTPSender" 改为 transport pivot="java:org. apache.axis.transport.http.CommonsHTTPSender”在 client-config.wsdd 文件中。这个问题在没有设置 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>
    

    【讨论】:

      【解决方案2】:

      以下是常规身份验证的工作原理(也称为抢先身份验证 - 例如 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

      【讨论】:

        猜你喜欢
        • 2012-10-15
        • 1970-01-01
        • 2011-04-30
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2011-10-24
        • 1970-01-01
        相关资源
        最近更新 更多