为什么需要先发制人的认证?
System.setProperty("httpclient.authentication.preemptive",“真”);
我用java编写了web服务访问客户端程序。我们在call对象中设置用户名和密码,这是非常有效的。
最近,我们的服务提供者在他们身边做了一些更改,之后他们在web服务调用中没有接收用户名和密码,因为他们没有接收用户名和密码,所以我们无法连接到他们的(提供者)服务。
然后我在谷歌上搜索并发现了先发制人的身份验证。在调用web服务时,我们将"httpclient.authentication.preemptive“设置为"true”--httpclient.authentication.preemptive "true");然后,我们就能够接收来自服务提供者的响应。
当我们删除System.setProperty("httpclient.authentication.preemptive",“真”;行时,我们就无法连接到它们的服务。
发布于 2018-07-09 08:01:09
以下是常规身份验证的工作原理(也称为先发制人身份验证--例如Curl是如何实现的):
用户指示客户端向http://user:pass@example.com
Authorization: Basic dXNlcjpwYXNz
进行响应。
以下是非先发制人身份验证的工作原理(例如,Apache的HttpClient是如何实现的):
用户指示客户端向http://user:pass@example.com
WWW-Authenticate: Basic realm="Default Realm"
Authorization: Basic dXNlcjpwYXNz
进行响应。
为什么我们要用第二种方法?它确保只有需要身份验证的服务器才能获得您的密码。但这确实意味着服务器必须以正确的方式进行响应( WWW-Authenticate头)。也许这就是在您的情况下失败的原因,以及为什么您必须覆盖您的HTTP客户端来强制先发制人的身份验证。
(如果您想更好地了解客户端和服务器之间的实际情况,我建议使用Wireshark。您可以在这里阅读Apache的HTTP关于以下主题的文档:http://hc.apache.org/httpclient-3.x/authentication.html )
发布于 2012-02-27 14:06:53
当我们在client-config.wsdd文件中将传输pivot="java:org.apache.axis.transport.http.HTTPSender“更改为传输时。这个问题在没有设置System.setProperty("httpclient.authentication.preemptive",“true”的情况下得到解决;
客户端-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>https://stackoverflow.com/questions/7482523
复制相似问题