WEB开发网
开发学院WEB开发Jsp Java 编程语言中的口令屏蔽 阅读

Java 编程语言中的口令屏蔽

 2008-01-05 19:15:33 来源:WEB开发网   
核心提示:目前,对于 java 命令行基于文本的输入/输出 API 的批评之一就是它缺乏对命令行输入口令屏蔽的支持,Java 编程语言中的口令屏蔽,假如借助 AWT/Swing,这便不再成为问题,然后使用星号代替它们,这是使用 EraserThread 类来完成的,因为 AWT/Swing 提供了可以提供屏蔽口令的方法,2002

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

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

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

口令屏蔽

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

假如操作系统是 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 不同,在 Java 中没有非凡的 API 可用于屏蔽命令行输入。这也是许多开发人员一直所要求的一项功能。假如您希望为命令行基于文本的 Java 应用程序以及服务器端 Java 应用程序提供一个登录屏幕,它就很有用。提供这种功能的一种方式就是使用 Java 本地接口(Java Native Interface ,JNI)。对于不了解 C/C++ 或者希望坚持 100% 纯 Java 代码的某些 Java 开发人员来说,这可能有一定难度。

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

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


  简单的解决方案

这个解决方案使用一个单独的线程,在输入回显字符的时候擦除它们,然后使用星号代替它们。这是使用 EraserThread 类来完成的,如代码示例 1 所示。

代码示例 1:EraserThread.java

import java.io.*;

class EraserThread implements Runnable {
  PRivate boolean stop;

  /**
   *@param The prompt displayed to the user
   */
  public EraserThread(String prompt) {
    System.out.print(prompt);
  }

  /**
   * Begin maSKINg...display asterisks (*)
   */
  public void run () {
    stop = true;
    while (stop) {
     System.out.print("\010*");
     try {
       Thread.currentThread().sleep(1);
     } catch(InterruptedException ie) {
       ie.printStackTrace();
     }
    }
  }


Tags:Java 编程语言 口令

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接