HttpClient支持哪几种身份验证方案呢?
转自:
http://www.java265.com/JavaCourse/202204/3172.html
下文笔者讲述HttpClient支持的http身份验证方案,如下所示
服务器认证
httpClient同服务器进行交互, 必须提供相应的登录凭证,这些凭证通常存储在HttpState实例中, 可以使用 setCredentials(AuthScope authscope, Credentials cred) 和 getCredentials(AuthScope authscope) 设置和查询相应的授权信息
提前认证
为了减少服务器交互的开销,我们可提前设置身份验证 client.getParams().setAuthenticationPreemptive(true); defaultcreds = new UsernamePasswordCredentials("username", "password"); client.getState().setCredentials(new AuthScope("myhost", 80, AuthScope.ANY_REALM), defaultcreds); 注意事项: 在一些不受信任的站点中和web应用程序中,我们应谨慎使用默认凭证 笔者建议非调试模式,应避免使用默认账号和密码
代理身份验证
代理身份验证,应使用 setProxyCredentials(AuthScope authscope, Credentials cred) getProxyCredentials(AuthScope authscope) 设置和获取授权信息
身份认证方案
基本认证方案
这是一种最原始且兼容性非常好的身份认证方案, 它发送给服务器的用户名和密码都是未加密的信息
摘要式身份认证加密
它不通过网络传输用户名和密码, 而是使用用户名和密码对服务器发送过来的nonce值进行加密,作为服务器凭证传送 摘要式身份认证需要一个UsernamePasswordCredentials实例
NTLM身份认证
NTLM是HttpClient支持的最复杂的身份验证协议 它是由Microsoft设计的专有协议,是一个未公开可用的规范 早期的NTLM版本,没有Digest身份验证安全, 但是这些在 Windows NT 4 的服务包中得到修复,现在此协议被认为比Digest身份验证更安全 NTLM身份验证要求NTCredentials实例可用于服务器的域名或默认凭据 请注意,由于NTLM不使用领域的概念 因此HttpClient使用服务器的域名作为领域的名称 另请注意,提供给NTCredentials的用户名不应以域为前缀 即:"username"是正确 而"DOMAINusername"是不正确的 NTLM与基本身份验证和摘要式身份验证相比 NTLM 的工作方式存在一些显着差异 这些差异通常由HttpClient处理
NTLM 身份验证的工作方式与 HttpClient API的其他身份验证几乎完全相同 唯一的区别是您需要提供“NTCredentials”而不是“UsernamePasswordCredentials” (NTCredentials 实际上扩展UsernamePasswordCredentials 因此如果需要,您可以在整个应用程序中使用 NTCredentials) NTLM 身份验证的领域是要连接的计算机的域名, 因为服务器通常有多个引用它们的域名 只有 HttpClient 连接的域名(由 HostConfiguration 指定)用于查找凭据 通常建议在最初测试 NTLM 身份验证时,将领域作为默认值传递给 null。 NTLM 对连接而不是请求进行身份验证,因此每次建立新连接时都需要进行身份验证,并且在身份验证期间保持连接打开至关重要 因此,NTLM 不能同时用于代理和服务器的身份验证,NTLM也不能用于HTTP 1.0连接或不支持HTTP keep-alives的服务器