王朝网络
分享
 
 
 

使用Java 1.2的Authenticator 类

王朝java/jsp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

当您用喜好的浏览器在网上冲浪时,您会碰到要求代理服务器认证或 HTTP 服务器认证的 URL,并会出现您再熟悉不过的窗口要求您输入用户名及口令:

从浏览器访问一个诸如 http://www.lombard.com/cgi-bin/Quotes/quote 这样的 URL 不成问题,因为您自己可以提供用户名和口令。但是当您试图通过 Java 程序从与此 URL 相关的 InputStream 中读取数据时,该 Java 程序就会发出 FileNotFoundException 异常。

在 Java 1.0 或 1.1 中,您可以通过在连接时记入 (post) 适当的认证字符串来避免这种情况,但这种方法仅在您事先知道该 URL 是受保护的时才奏效。(Authorization: Basic username:passWord,其中基本认证域是以 base 64 编码的。)假如您事先没有预见到文档是受保护的,则您甚至无法读取文件内容。(有关用 Java 1.1 applet 或应用程序访问口令保护的 URL 的解决方案,请参阅“Java 技巧 47:再谈 URL 认证”。值得庆幸的是,Java 1.2 在 java.net 包中添加了一个 Authenticator 类,这使得访问口令保护的 URL 变得极为轻易。

现在,对于 Java 1.2,您只需用 Authenticator.setDefault() 安装一个 Authenticator。这样,当需要认证时,已安装的 Authenticator 的 getPasswordAuthentication() 方法就会被调用,然后您就可以用适当的用户名和口令来设置 PasswordAuthentication 实例。就这么简单。

所需步骤如下所示。

第一步:安装 Authenticator

Authenticator.setDefault (new MyAuthenticator ());

第二步:创建 Authenticator 的子类

class MyAuthenticator extends Authenticator {

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication ("username", "password");

}

}

以下程序完整地显示了这种行为,它提供了自己的认证提示对话框。

import java.io.*;

import java.net.*;

import java.awt.*;

import java.awt.event.*;

public class URLPassword extends Frame {

private TextField tf = new TextField();

private TextArea ta = new TextArea();

public URLPassword() {

super ("URL Password");

// 安装 Authenticator

Authenticator.setDefault (new MyAuthenticator ());

// 设置屏幕

add (tf, BorderLayout.NORTH);

ta.setEditable(false);

add (ta, BorderLayout.CENTER);

tf.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {

String s = tf.getText();

if (s.length() != 0)

ta.setText (fetchURL (s));

}

});

addWindowListener (new WindowAdapter() {

public void windowClosing (WindowEvent e) {

dispose();

System.exit(0);

}

});

}

private String fetchURL (String urlString) {

StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

try {

URL url = new URL (urlString);

InputStream content = (InputStream)url.getContent();

BufferedReader in =

new BufferedReader (new InputStreamReader (content));

String line;

while ((line = in.readLine()) != null) {

pw.println (line);

}

} catch (MalformedURLException e) {

pw.println ("Invalid URL");

} catch (IOException e) {

pw.println ("Error reading URL");

}

return sw.toString();

}

public static void main (String args[]) {

Frame f = new URLPassword();

f.setSize(300, 300);

f.setVisible (true);

}

class MyAuthenticator extends Authenticator {

protected PasswordAuthentication getPasswordAuthentication() {

final Dialog jd = new Dialog (URLPassword.this, "Enter password", true);

jd.setLayout (new GridLayout (0, 1));

Label jl = new Label (getRequestingPrompt());

jd.add (jl);

TextField username = new TextField();

username.setBackground (Color.lightGray);

jd.add (username);

TextField password = new TextField();

password.setEchoChar (´*´);

password.setBackground (Color.lightGray);

jd.add (password);

Button jb = new Button ("OK");

jd.add (jb);

jb.addActionListener (new ActionListener() {

public void actionPerformed (ActionEvent e) {

jd.dispose();

}

});

jd.pack();

jd.setVisible(true);

return new PasswordAuthentication (username.getText(), password.getText());

}

}

}

后续技巧!

来自 Luis Blanco Gomez

代码的第 85 行(MyAuthenticator 类的返回参数)显示一个错误:

return new PasswordAuthentication (username.getText(), password.getText());

编译器将报错:

URLPass.java:88: Incompatible type for constrUCtor. Can´t convert

java.lang.String to char[].

return new PasswordAuthentication ( username.getText(), password.getText());

为修正此错误,您必须声明一个 String 变量来存储 password.getText();例如,"String pass= password.getText();",并将返回行改为:

return new PasswordAuthentication ( username.getText(), pass.toCharArray());

为了测试这个程序,必须找出一个您知道其用户名和口令的 URL。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有