Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543487
  • 博文数量: 855
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-16 19:08
文章分类

全部博文(855)

文章存档

2011年(1)

2008年(854)

我的朋友

分类:

2008-10-16 19:17:22

  目前,对于 命令行基于文本的输入/输出 API 的批评之一就是它缺乏对命令行输入口令屏蔽的支持。如果借助 AWT/Swing,这便不再成为问题,因为 AWT/Swing 提供了可以提供屏蔽口令的方法。

  2002 年 9 月,我发表了本文的早期版本,其后便不断收到大量感谢信、建设性的意见和在应用程序中使用源代码的许可。本文:

  概述了口令屏蔽
  描述了用于口令屏蔽的
  AWT/Swing 实用程序
  为命令行输入口令屏蔽问题
  提供独立于平台的解决方案
  为口令屏蔽提供一个改进的解决方案(可靠而)

  口令屏蔽

  登录屏幕和登录对话框使用口令屏蔽技术,这种技术要么在输入口令时隐藏口令,要么显示一个字符(比如星号'*')来代替用户输入的字符。例如,当您在一台 机器上进行登录时,一个登录对话框将会呈现在您眼前,其中的口令一栏使用星号作为屏蔽或回显字符。

  如果操作系统是 UNIX,则登录屏幕中的口令栏不显示回显字符。它的做法很简单,就是什么都不显示,

  AWT/Swing 中的口令屏蔽

  如果您希望为您的应用程序提供图形化的登录对话框,您可以使用 AWT 的 TextField 类,该类是一个文本组件,允许编辑单行文本。为了屏蔽口令栏,要使用 setEchoChar 方法。例如,为了把回显字符设置为星号,您需要这样做:

TextField password = new TextField(8);
password.setEchoChar('*');

  基于所使用字体的平均字符宽度,数字8指定了文本栏的宽度。您可以把回显字符设置为任何您喜欢的字符。注意,如果您把它设置为0,这意味着输入将会被回显,而不会被屏蔽。

  在 Swing 中,您可以使用 JPasswordField,它允许编辑单行文本,视图表明正在输入内容,但是不会显示原始字符。JPasswordField 类与和 setEchoChar 一起使用的 AWT 的 TextField 是源代码兼容的。如果您使用 JPasswordField, 默认的回显字符是星号 '*', 但是您可以将其修改为任何您选定的字符。此外,如果您把回显字符设置为 0,这意味着字符将在输入时显示出来,而不会被屏蔽。图 2 显示了一个 Swing 登录对话框,其中的回显字符被设置为 #,使用的是下面的代码片断:

JPasswordField password = new JPasswordField(8);
password.setEchoChar('#');

  命令行输入屏蔽

  和 AWT/Swing 不同,在 中没有特殊的 API 可用于屏蔽命令行输入。这也是许多开发人员一直所要求的一项功能。如果您希望为命令行基于文本的 Java 应用程序以及端 Java 应用程序提供一个登录屏幕,它就很有用。提供这种功能的一种方式就是使用 Java 本地接口(Java Native Interface ,JNI)。对于不了解 C/ 或者希望坚持 100% 纯 Java 代码的某些 Java 开发人员来说,这可能有一定难度。

  这里我针对这个问题提出一个解决方案。在本文的早期版本中,所使用的是一个 UNIX 风格的登录屏幕,口令根本不在屏幕上回显。这样做的具体方法是,让一个单独的线程通过重写和打印口令提示命令行,尝试擦除回显到控制台的字符。大家仍然可以从论坛该篇文章中专用的代码和改进后的代码。

  然而,大家最需要的功能之一是使用星号"*"替换回显的字符。因此,本文从为口令屏蔽提供一个简单的解决方案开始,接着给出改进后的、更加可靠和的代码。

[1]     

【责编:Kittoy】

--------------------next---------------------

阅读(421) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~