使用Java 1.2的Authenticator 類

當您用喜好的浏覽器在網上沖浪時,您會碰到要求代理服務器認證或 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。

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
 
使用Java 1.2的Authenticator 類
  當您用喜好的浏覽器在網上沖浪時,您會碰到要求代理服務器認證或 HTTP 服務器認證的 URL,並會出現您再熟悉不過的窗口要求您輸入用戶名及口令:從浏覽器訪問一個諸如 http://www.lombard.com/cgi-bin/Quotes/quo...查看完整版>>使用Java 1.2的Authenticator 類
 
使用 Java 1.2 的 Authenticator 類
使用 Java 1.2 的 Authenticator 類
  您用喜好的浏覽器在網上沖浪時,您會碰到要求代理服務器認證或 HTTP 服務器認證的 URL,並會出現您再熟悉不過的窗口要求您輸入用戶名及口令:     從浏覽器訪問一個諸如 http://www.lombard.com/cgi-bin/Quo...查看完整版>>使用 Java 1.2 的 Authenticator 類
 
使用Java1.2的Authenticator類
  您用喜好的浏覽器在網上沖浪時,您會遇到要求代理服務器認證或 HTTP 服務器認證的 URL,並會出現您再熟悉不過的窗口要求您輸入用戶名及口令:  從浏覽器訪問一個諸如 http://www.lombard.com/cgi-bin/Quotes/q...查看完整版>>使用Java1.2的Authenticator類
 
關于6288的JAVA應用程序的使用
6288發彩信或上網都需要設置的,這一點大家已經說過很多次了,我在這裏就不重複的發了.但是,現在很多JAVA應用程序都是要經過連網才可以用的.如手機網絡遊戲,移動QQ,免費發短信軟件等.使這些程序訪問網絡,就需要設置一下...查看完整版>>關于6288的JAVA應用程序的使用
 
GF500 JAVA 使用安裝方法
各位兄弟 小弟不才 終于摸索出 安裝方法 不太明白的可以看下 首先 確保數據線正常(因爲鄙人的數據線天生有毛病一直不能與手機連接,後來用女朋友的數據線才正常使用 我的哪個數據線壞了)驅動程序安裝正常後 連接手...查看完整版>>GF500 JAVA 使用安裝方法