前言
大家知道在登录Microsoft Windows操作系统过程中在登录窗口中需要用户输入注册用户名称和密码细心的读者会发现用户输入的注册用户名称内容为原码字符显示而注册密码内容为掩码字符显示例如同样在两各文本区中输入字符a在用户名文本区中显示的是字符a而在密码区中显示的字符为掩码*这就是所谓的密码屏蔽输入将输入的密码屏蔽回显不仅增强了用户私有信息的安全性更重要的是维护了计算机系统的稳定性和安全性
Java以其语言的面向对象能力高安全性和Java平台的系统无关性等技术优势在商务软件开发过程中赢得了众多程序设计人员的青睐JDK在AWT和JFC类库中定义了用于密码字符屏蔽的应用程序设计接口(API)使应用系统开发人员在编写图形用户界面程序时能够灵活地定义密码回显方式但是对于基于命令行方式的Java应用程序JDK没有定义相应的密码屏蔽策略程序设计人员必须编写字符回显控制代码本文将通过对实例代码的分析对基于JDK平台开发Java应用程序的密码屏蔽输入方法进行探讨主要内容包括
●AWT组件对象密码屏蔽方法
●JSwing组件对象密码屏蔽方法
●Java命令行程序密码屏蔽方法
利用AWT组件实现密码屏蔽输入
Java抽象窗口工具包(Abstract Window ToolkitAWT)是在JDK版本中定义的用于编写Java图形用户界面程序的应用程序设计接口程序设计人员可以利用该包中定义的多种类型组件对象编写具有用户界面的应用程序
为了实现用户输入信息的屏蔽可以利用AWT组件库中定义的TextField对象该对象的定义继承结构如下
javalangObject
|
+javaawtComponent
|
+javaawtTextComponent
|
+javaawtTextField
在该对象中定义了用于设置和维护用户输入字符回显方式的方法这些方法的定义形式为
char getEchoChar()获取用户定义的文本区回显字符
boolean echoCharIsSet()判断是否定义了回显字符
void setEchoChar(char c)设置文本区回显字符为字符c
因此在读者编写的Java程序中可以在创建TextField对象实例后例如上述方法控制文本区回显字符的方式下面的程序完整地演示了回显字符的定义方式
//PasswordMaskingDemojava
import javaawt*;
import javaawtevent*;
import javaxswingJOptionPane;
public class PasswordMaskingDemo
{
public static void main(String args[])
{
final Frame frmFrame = new Frame();
Panel pnlPanel = new Panel();
Label lblUsername = new Label(用户名);
Label lblPassword = new Label(密码);
final TextField txtUsername = new TextField(Anyomonus);
final TextField txtPassword = new TextField( );
txtUsernamesetEditable(false);
txtPasswordsetEchoChar(*);
Button btnButton = new Button(登录);
Button btnButton = new Button(其它用户登录);
Button btnButton = new Button(关闭);
btnButtonaddActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if( (txtPasswordgetText())length() == )
{
JOptionPaneshowMessageDialog
(frmFrame 密码不能为空);
return;
}
txtPasswordsetColumns();
Systemoutprintln(Anyomonus用户的密码 +
txtPasswordgetText() );
}
});
btnButtonaddActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
txtUsernamesetEditable(true);
}
});
btnButtonaddActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Systemexit();
}
});
pnlPaneladd(lblUsername);
pnlPaneladd(txtUsername);
pnlPaneladd(lblPassword);
pnlPaneladd(txtPassword);
pnlPaneladd(btnButton);
pnlPaneladd(btnButton);
pnlPaneladd(btnButton);
frmFrameadd(pnlPanel);
frmFramesetTitle(演示TextField对象的应用方法);
frmFramepack();
frmFrameshow();
}
}
该程序运行的窗口形式如下图所示
图 PasswordMaskingDemojava程序运行窗口
在上述程序中与文本区回显控制相关的代码为
final TextField txtPassword = new TextField( );
txtPasswordsetEchoChar(*);
在上面的代码中首先创建初始内容为空可输入个字符的TextField对象实例txtPassword后利用TextField对象中定义的setEchoChar方法设置该文本区的回显字符为星号*从而实现输入字符的掩码因此总结为可以利用TextField对象中定义的setEchoChar方法实现AWT组件对象程序中的字符掩码输入和回显控制
利用JSwing组件对象实现密码屏蔽输入
JSwing组件对象是轻量级Java组件对象其中定义了多种组件对象类型而且其外观也更加新颖与AWT组件对象相对应在JSwing组件对象中也定义了JTextField对象用于用户进行文本输入那么读者是否会联想利用对象中也定义的setEchoChar方法定义回显字符呢?实际情况不是这样在JTextField对象中没有定义该方法而是以JTextField为父对象定义了用于进行密码输入的文本区对象JPasswordField该对象的定义继承结构如下
javalangObject
|
+javaawtComponent
|
+javaawtContainer
|
+javaxswingJComponent
|
+javaxswingtextJTextComponent
|
+javaxswingJTextField
|
+javaxswingJPasswordField
在JPasswordField对象中定义了多种类型