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