您用喜好的浏览器在网上沖浪时您会遇到要求代理服务器认证或 HTTP 服务器认证的 URL并会出现您再熟悉不过的窗口要求您输入用户名及口令
从浏览器访问一个诸如 bin/Quotes/quote 这样的 URL 不成问题因为您自己可以提供用户名和口令但是当您试图通过 Java 程序从与此 URL 相关的 InputStream 中读取数据时该 Java 程序就会发出 FileNotFoundException 异常
在 Java 或 中您可以通过在连接时记入 (post) 适当的认证字符串来避免这种情况但这种方法仅在您事先知道该 URL 是受保护的时才奏效(Authorization: Basic username:password其中基本认证域是以 base 编码的)如果您事先没有预见到文档是受保护的则您甚至无法读取文件内容(有关用 Java applet 或应用程序访问口令保护的 URL 的解决方案请参阅Java 技巧 再谈 URL 认证值得庆幸的是Java 在 包中添加了一个 Authenticator 类这使得访问口令保护的 URL 变得极为容易
现在对于 Java 您只需用 AuthenticatorsetDefault() 安装一个 Authenticator这样当需要认证时已安装的 Authenticator 的 getPasswordAuthentication() 方法就会被调用然后您就可以用适当的用户名和口令来设置 PasswordAuthentication 实例就这么简单
所需步骤如下所示
第一步安装 Authenticator
AuthenticatorsetDefault (new MyAuthenticator ());
第二步创建 Authenticator 的子类
class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (username password);
}
}
以下程序完整地显示了这种行为它提供了自己的认证提示对话框
import javaio*;
import *;
import javaawt*;
import javaawtevent*;
public class URLPassword extends Frame {
private TextField tf = new TextField();
private TextArea ta = new TextArea();
public URLPassword() {
super (URL Password);
// 安装 Authenticator
AuthenticatorsetDefault (new MyAuthenticator ());
// 设置屏幕
add (tf BorderLayoutNORTH);
tasetEditable(false);
add (ta BorderLayoutCENTER);
tfaddActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {
String s = tfgetText();
if (slength() != )
tasetText (fetchURL (s));
}
});
addWindowListener (new WindowAdapter() {
public void windowClosing (WindowEvent e) {
dispose();
Systemexit();
}
});
}
private String fetchURL (String urlString) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try {
URL url = new URL (urlString);
InputStream content = (InputStream)urlgetContent();
BufferedReader in =
new BufferedReader (new InputStreamReader (content));
String line;
while ((line = inreadLine()) != null) {
pwprintln (line);
}
} catch (MalformedURLException e) {
pwprintln (Invalid URL);
} catch (IOException e) {
pwprintln (Error reading URL);
}
return swtoString();
}
public static void main (String args[]) {
Frame f = new URLPassword();
fsetSize( );
fsetVisible (true);
}
class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
final Dialog jd = new Dialog (URLPasswordthis Enter password true);
jdsetLayout (new GridLayout ( ));
Label jl = new Label (getRequestingPrompt());
jdadd (jl);
TextField username = new TextField();
usernamesetBackground (ColorlightGray);
jdadd (username);
TextField password = new TextField();
passwordsetEchoChar (*);
passwordsetBackground (ColorlightGray);
jdadd (password);
Button jb = new Button (OK);
jdadd (jb);
jbaddActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {
jddispose();
}
});
jdpack();
jdsetVisible(true);
return new PasswordAuthentication (usernamegetText() passwordgetText());
}
}
}