(一)Java SE 6 新特性: HTTP 增强

发表于:2007-8-03 16:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李夷磊 胡睿    来源:网络转载

#
java

        2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马)。跟 Tiger(Java SE 5)相比,Mustang 在性能方面有了不错的提升。与 Tiger 在 API 库方面的大幅度加强相比,虽然 Mustang 在 API 库方面的新特性显得不太多,但是也提供了许多实用和方便的功能:在脚本,WebService,XML,编译器 API,数据库,JMX,网络和 Instrumentation 方面都有不错的新特性和功能加强。 本系列 文章主要介绍 Java SE 6 在 API 库方面的部分新特性,通过一些例子和讲解,帮助开发者在编程实践当中更好的运用 Java SE 6,提高开发效率。

        本文是系列文章的第二篇,介绍了Java SE 6 在 HTTP 方面的新特性。

概述

        Java 语言从诞生的那天起,就非常注重网络编程方面的应用。随着互联网应用的飞速发展,Java 的基础类库也不断地对网络相关的 API 进行加强和扩展。在 Java SE 6 当中,围绕着 HTTP 协议出现了很多实用的新特性:NTLM 认证提供了一种 Window 平台下较为安全的认证机制;JDK 当中提供了一个轻量级的 HTTP 服务器;提供了较为完善的 HTTP Cookie 管理功能;更为实用的 NetworkInterface;DNS 域名的国际化支持等等。

NTLM 认证

        不可避免,网络中有很多资源是被安全域保护起来的。访问这些资源需要对用户的身份进行认证。下面是一个简单的例子:

import java.net.*;
import java.io.*;

public class Test {
 public static void main(String[] args) throws Exception {
  URL url = new URL("http://PROTECTED.com");
  URLConnection connection = url.openConnection();
  InputStream in = connection.getInputStream();
  byte[] data = new byte[1024];
  while(in.read(data)>0)
  {
   //do something for data
  }
  in.close();
 }
}
 


        当 Java 程序试图从一个要求认证的网站读取信息的时候,也就是说,从联系于http://Protected.com这个 URLConnection 的 InputStream 中 read 数据时,会引发 FileNotFoundException。尽管笔者认为,这个 Exception 的类型与实际错误发生的原因实在是相去甚远;但这个错误确实是由网络认证失败所导致的。

        要解决这个问题,有两种方法:

        其一,是给 URLConnection 设定一个“Authentication”属性:

String credit = USERNAME + ":" + PASSWORD;
String encoding = new sun.misc.BASE64Encoder().encode (credit.getBytes());
connection.setRequestProperty ("Authorization", "Basic " + encoding);
 


        这里假设http://PROTECTED.COM使用了基本(Basic)认证类型。

        从上面的例子,我们可以看出,设定 Authentication 属性还是比较复杂的:用户必须了解认证方式的细节,才能将用户名/密码以一定的规范给出,然后用特定的编码方式加以编码。Java 类库有没有提供一个封装了认证细节,只需要给出用户名/密码的工具呢?

        这就是我们要介绍的另一种方法,使用 java.net.Authentication 类。

        每当遇到网站需要认证的时候,HttpURLConnection 都会向 Authentication 类询问用户名和密码。

        Authentication 类不会知道究竟用户应该使用哪个 username/password 那么用户如何向 Authentication 类提供自己的用户名和密码呢?

        提供一个继承于 Authentication 的类,实现 getPasswordAuthentication 方法,在 PasswordAuthentication 中给出用户名和密码:

class DefaultAuthenticator extends Authenticator {
 public PasswordAuthentication getPasswordAuthentication () {
  return new PasswordAuthentication ("USER", "PASSWORD".toCharArray());
 }
}
   


        然后,将它设为默认的(全局)Authentication:

Authenticator.setDefault (new DefaultAuthenticator());
 

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号