J2EE 站点认证简介
网站建设哪家好,找成都创新互联公司!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了沧源免费建站欢迎大家使用!
出于安全性的需要和用户授权管理的考虑,常见的 J2EE 站点对特定资源都会加入认证/授权机制。例如一个公网上的论坛,一个只对特定用户开放的 RSS 或 Atom Feed,这些资源都必须在确信访问者为被授权用户时才能向访问者开放。为了实现这样的功能,J2EE 站点通常会采用某种站点认证机制,其中常见的有 HTTP Basic 认证和 J2EE Form-Based 认证。
HTTP Basic 认证
HTTP Basic 认证是 HTTP 认证协议(rfc2617)所定义的标准认证方式。要求 HTTP Basic 认证的服务器会在客户端访问受保护资源时向客户端发出请求,要求客户端上传用户名和密码对。服务器在收到用户名/密码并验证通过后,才将保护资源的内容返回给客户端。它的工作机制如下图:
图 1. HTTP Basic 认证原理
由于是 HTTP 规范,因而常见的浏览器,如 Internet Explorer,Mozilla Firefox,在 步骤 2 中收到服务器对用户名和密码的请求时会弹出认证对话框,供用户输入用户名/密码。
图 2. Firefox 在收到步骤 2 中请求时弹出的用户名/密码输入框
HTTP Basic 认证方式使用 base64 编码方式传送用户名和密码,而 base64 仅仅是一种公开的编码格式而非加密措施,因而如果信道本身不使用 SSL 等安全协议,用户密码较容易被截获。
J2EE Form-Based 认证
Form-Based 认证不同于 HTTP Basic 认证,它是 J2EE 对于认证方式的一种扩展。它使用自定义的 HTML 表单(通常为 login.jsp)作为输入用户名和密码的用户界面,最终将用户在表单上填入的用户名/密码提交至服务器。它的工作机制如下:
图 3. Form-Based 认证原理
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 中,支持的认证方式有:
我们可以注意到 Form-Based 认证并不在其中,这是因为 Form-Based 认证方式并非 HTTP 协议标准,而是 J2EE 提供的一种特殊的认证方式,因而开发者需要在 HttpClient 基础上另行开发适合 Form-Based 认证的方案。
使用 Apache HttpClient 通过 HTTP Basic 认证
由于 HttpClient 内置支持 HTTP Basic 认证方式,因而使用 HttpClient 通过 HTTP Basic 认证的步骤显得较为简单。
执行 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 个关键步骤:
清单 2. 在 HttpClient 中自定义 SSL 示例
- // 1
- SecureProtocolSocketFactory sampleSSLSocketFactory = new SampleSSLSocketFactory();
- // 2
- Protocol httpsProtocol = new Protocol("https", sampleSSLSocketFactory, 443);
- // 3
- Protocol.registerProtocol("https", httpsProtocol);
- HttpClient client = new HttpClient();
- client.getState().setCredentials(
- new AuthScope("www.sample.com", 80, AuthScope.ANY_REALM),
- new UsernamePasswordCredentials("username", "password")
- );
- // Request the protected resource via SSL
- GetMethod get = new GetMethod("https://www.sample.com/protected.html");
- get.setDoAuthentication( true );
- try {
- int status = client.executeMethod( get );
- // process the content from the response
- …
- } finally {
- get.releaseConnection();
- }
使用 Apache HttpClient 通过 Form-Based 认证
Form-Based 认证相对 HTTP Basic 认证而言过程较为复杂,需要开发者记录下相关的 cookie 信息和部分 header 字段并多次向站点发出请求。它的大致原理如下:
注意:不同的应用可能有不同的配置方式,开发者可以先在浏览器中手动访问受保护资源,获取 login.jsp。进行分析后即可获知对应的认证服务资源 j_security_check 的位置以及对应的用户名与密码在表单中的字段。
假定我们需要访问的受保护资源为 http://www.sample.com/sampleApp/sample.rss。首先我们需要向此保护资源发出请求。而由 Form-Based 认证原理一节中可知,J2EE 服务器会将此请求重定向至 login.jsp。如果仔细分析 login.jsp 我们能发现它仅仅是一个 HTML 表单,其中有两个字段 j_username 和 j_password 分别记录用户名和密码,而提交的目标则是 j_security_check。通常情况下,J2EE 构架会在每个站点应用的根节点定义一个 j_security_check 的资源。而我们的站点的应用程序根(Application Root)为 sampleApp。因而,通过将用户名,密码以及相关 cookie 和 header 字段以 POST 方式发送至 http://www.sample.com/sampleApp/j_security_check 即可通过站点认证。在通过站点认证后,服务器端将给出一个新的重定向,通常它将指向了用户最初试图访问的受保护资源(本例中也就是 http://www.sample.com/sampleApp/sample.rss)。我们只需要再次创建访问对象向此资源发出请求即可获得其内容。
以下给出一个示例:
清单 3. Form-Based 认证示例
- HttpClient client = new HttpClient();
- client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);
- // 1
- GetMethod authget = new GetMethod("httpwww.sample.comsampleAppsample.rss");
- try {
- client.executeMethod(authget);
- }
- catch (HttpException httpe) {
- httpe.printStackTrace();
- }
- catch (IOException ioe) {
- ioe.printStackTrace();
- }
- // 2
- NameValuePair[] data = new NameValuePair[2];
- data[0] = new NameValuePair("j_username", username);
- data[1] = new NameValuePair("j_password", password);
- PostMethod authpost = new PostMethod("http://www.sample.com/sampleApp/j_security_check");
- authpost.setRequestBody(data);
- // 3
- Header hCookie = authget.getRequestHeader("Cookie");
- Header hHost = authget.getRequestHeader("Host");
- Header hUserAgent = authget.getRequestHeader("User-Agent");
- if (hCookie == null || hHost == null || hUserAgent == null) {
- return null;
- }
- authpost.setRequestHeader(hCookie);
- authpost.setRequestHeader(hHost);
- authpost.setRequestHeader(hUserAgent);
- authget.releaseConnection();
- try {
- client.executeMethod(authpost);
- // 4
- Header header = authpost.getResponseHeader("location");
- if (header != null) {
- String newuri = header.getValue();
- GetMethod redirect = new GetMethod(newuri);
- client.executeMethod(redirect);
- // process the content from the response
- redirect.releaseConnection();
- }
- } catch (HttpException httpe) {
- httpe.printStackTrace();
- return null;
- } catch (IOException ioe) {
- ioe.printStackTrace();
- return null;
- }
- authpost.releaseConnection();
其中各个步骤解释如下:
小 结
随着 Web 2.0 时代的到来,Web 站点的数据和内容显得愈加重要。而为了收集这些数据,人们需要利用计算机本身的搜集能力,通过后台请求,而不是浏览器交互的方式去获取站点的数据。而商业站点中普遍存在的认证/授权机制显然成为了开发此类数据收集程序的一道屏障。Apache HttpClient 根据这些需求,提供了多种 HTTP 认证机制的实现方案。开发人员也可以利用 HttpClient 强大的底层功能,设计特定方案以通过 J2EE 站点的认证体系。
网页标题:使用ApacheHttpClient突破J2EE站点认证
浏览地址:http://www.mswzjz.cn/qtweb/news22/494872.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能