Form-Based 认证方式在 J2EE 站点中更为常见。这一方面是由于它提供了自定义的用户名密码输入界面;另一方面它的传输也更为安全,通常情况下 login.jsp 会被配置为需要使用 SSL 信道访问,这样在步骤 2、3 中对用户名和密码的传送就被安全信道所保护,而较难被非法截取。
Apache HttpClient 认证功能简介
Apache HttpClient 是 Apache 开源组织提供的纯 Java 实现的 HTTP 开源包。它能模拟各类 HTTP 客户端所需功能,例如 HTTP/HTTPS 连接,GET/PUT 请求,甚至提供了超时重试的功能。
HttpClient 也提供了对标准 HTTP 认证的接口,在最新的 HttpClient 3.1 中,支持的认证方式有:
· Basic 认证:即前面提到的 rfc2716 规范中定义的 HTTP Basic 认证方式。
· Digest 认证:一种基于摘要的更为安全的认证协议,虽然它的应用没有 Basic 认证方式广泛。
· NTLM 认证:微软制定的认证协议规范,然而此项标准的细节却并不公开。
我们可以注意到 Form-Based 认证并不在其中,这是因为 Form-Based 认证方式并非 HTTP 协议标准,而是 J2EE 提供的一种特殊的认证方式,因而开发者需要在 HttpClient 基础上另行开发适合 Form-Based 认证的方案。
使用 Apache HttpClient 通过 HTTP Basic 认证
由于 HttpClient 内置支持 HTTP Basic 认证方式,因而使用 HttpClient 通过 HTTP Basic 认证的步骤显得较为简单。
1. 为 HttpClient 的状态对象添加用户名/密码对。可以注意到在 setCredentials 方法中的另一个参数为 AuthScope 对象。事实上我们添加的每个用户名/密码对都与一个 AuthScope 对象相关联。AuthScope 对象确定了此用户名/密码对的适用站点,在示例中所给出的用户名/密码对将只适用于 www.sample.com 位于 80 端口上的资源。HttpClient 在与其他站点交互时将不会使用此用户名/密码对,这样有效地防止了机密数据被传送至不必要的站点。
2. 开启 HttpClient 提供的占先式(Preemptive)认证功能。开启了这个功能后,HttpClient 对于那些处在之前请求过的URI空间范围内的资源,会主动地随请求一起向服务器发送 Basic 认证数据,而不是等待服务器返回是否需要认证的响应后再提交认证。在多数情况下,能够减少请求-响应传递的次数,从而间接提高了服务器的响应能力。值得注意的是在这种情况下必须在 AuthScope 对象中明确指定适用站点,以避免向不相关的站点泄漏敏感数据。
3. 创建 GetMethod 对象,此对象将使用 GET 方式对保护资源发出 HTTP 请求。
4. setDoAuthentication(true) 语句将告知 HttpClient 在服务器端发回需要认证的请求后,自动将我们在步骤 1 中设置的用户名/密码对发送至服务器,以完成认证过程。
5. 执行 GET 请求,获取和处理受保护资源的内容。
清单 1. Basic 认证示例
HttpClient client = new HttpClient();
// 1
client.getState().setCredentials(
new AuthScope("www.sample.com", 80, AuthScope.ANY_REALM),
new UsernamePasswordCredentials("username", "password")
);
// 2
client.getParams().setAuthenticationPreemptive(true);
// 3
GetMethod get = new GetMethod("http://www.sample.com/protected.html");
// 4
get.setDoAuthentication( true );
try {
// 5
int status = client.executeMethod( get );
// process the content from the response
…
} finally {
get.releaseConnection();
}
|
由于 Basic 认证方式直接向服务器发送未经加密的用户名/密码对,导致这些敏感数据很容易在网络传输过程中被截取,因此安全性很低。所幸 HttpClient 对基于安全套接字层(SSL)的 HTTP 协议(HTTPS)提供了足够的支持,而且使用起来也很简单。不过之前需确保本地机器已经安装好 JSSE(Sun 提供的 JDK 1.4 及之后的版本已集成 JSSE)。
使用 HttpClient 进行标准的 SSL 连接对用户来说是透明的。参照清单 1,用户只需用符合 HTTPS 协议的 URL 作为参数生成 GetMethod 对象即可。除此之外,HttpClient 还允许用户定制 SSL 使得客户端程序能够自动接受不同类型的证书。
利用 HttpClient 实现一个自定义的 SSL 协议包括以下 3 个关键步骤:
1. 定制一个实现了 org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory 接口的工厂类。这个工厂类的作用是开启一个与服务器通讯的 Socket 并进行必需的初始化动作。关于实现该接口的具体细节,HttpClient 项目的主页上有详细的代码实例和注释说明。
2. 利用之前创建的工厂类对象、HTTPS 协议名称和默认端口号实例化一个新的 org.apache.commons.httpclient.protocol.Protocol 对象。
注册这个自定义的 Protocol 对象使其与某个协议名绑定,当 HttpClient 处理此类协议时,将默认调用这个自定义 Protocol 对象。
分享到:
相关推荐
这是一个关于httpclient4.5访问https网站的例子,可以绕过ssl认证直接访问
httpclient 实现https双向认证
使用HttpClient4.5实现https请求忽略SSL证书验证工具类
httpClient 教程 使用事例 单向认证
以上自己测试是可行的,直接拿过去导入即可,直接用main
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。 7. 插件式的自定义认证方案。 8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。 9. 连接管理器支持多线程应用。支持设置...
NULL 博文链接:https://liudeh-009.iteye.com/blog/1181571
http远程接口调用-httpClient+跳过SSL证书校验. 里面分别有3个httpClient的工具类代码。 还有一个专门为了跳过SSL证书校验的工具类。
所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过...
NULL 博文链接:https://bewithme.iteye.com/blog/1938178
复制进eclipse即可用。main方法测试
出于安全性的需要和用户授权管理的考虑,常见的 J2EE 站点对特定资源都会加入认证/授权机制。例如一个公网上的论坛,一个只对特定用户开放的 RSS 或 Atom Feed,这些资源都必须在确信访问者为被授权用户时才能向访问...
HttpClient post请求(用于key-value格式的参数), post请求(用于请求json格式的参数),加入了请求头以及token认证,成功之后读取服务器返回过来的json字符串数据
https 的支持单向认证 支持多线程 支持get、post
包含连接管理、Http状态管理、HTTP认证、快速APi、HTTP缓存等
得到的HttpClient在执行请求时将自动携带身份认证信息,并检查应答的微信支付签名。 项目状态 当前版本0.2.2为测试版本。请商户的专业技术人员在使用时注意系统和软件的正确性和兼容性,以及带来的风险。 环境要求 ...
本资源为HttpClient教程,分为7个大的章节,从概念到连接管理,以及Http状态管理,http认证,快速API,HTTP缓存以及一些高级应用全方位仔仔细细认认真真的讲解。
基于java的HTTPS模拟上传,只有一个类和一个测试类。主要解决java模拟https上传文件使用
httpclient模拟浏览器中一个表单提交或者说异步提交的方法,返回通常为json或xml的格式,可以采用POST和GET传送并设置字符集以及超时控制。 URL暴露方式双方约定认证协议方法即可,另一种是获取cookie方式,但是...
httpclient-4.5.3中文版.CHM org.apache.http.auth 客户端HTTP认证API。 org.apache.http.auth.params 已过时。 org.apache.http.client 客户端HTTP通信API。 org.apache.http.client.config 客户端配置API。 ...