java

位置:IT落伍者 >> java >> 浏览文章

使用 Java 1.2 的 Authenticator 类


发布日期:2023年12月01日
 
使用 Java 1.2 的 Authenticator 类

您用喜好的浏览器在网上沖浪时您会遇到要求代理服务器认证或 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());

}

}

}               

上一篇:Java能够成为完美的技术平台吗?

下一篇:JavaFX 深入浅出(二)基本数据类型