1 前言 大家知道,在登录Microsoft Windows操作系统过程中,在登录窗口中需要用户输入注册用户名称和密码。细心的读者会发现:用户输入的注册用户名称内容为原码字符显示,而注册密码内容为掩码字符显示。例如,同样在两各文本区中输入字符"a",在用户名文本区中显示的是字符"a",而在密码区中显示的字符为掩码"*",这就是所谓的密码屏蔽输入。将输入的密码屏蔽回显,不仅增强了用户私有信息的安全性,更重要的是维护了计算机系统的稳定性和安全性。 Java以其语言的面向对象能力、高安全性和Java平台的系统无关性等技术优势,在商务软件开发过程中赢得了众多程序设计人员的青睐。JDK在AWT和JFC类库中定义了用于密码字符屏蔽的应用程序设计接口(API),使应用系统开发人员在编写图形用户界面程序时,能够灵活地定义密码回显方式。但是,对于基于命令行方式的Java应用程序,JDK没有定义相应的密码屏蔽策略,程序设计人员必须编写字符回显控制代码。本文将通过对实例代码的分析,对基于JDK平台开发Java应用程序的密码屏蔽输入方法进行探讨,主要内容包括: ●AWT组件对象密码屏蔽方法 ●JSwing组件对象密码屏蔽方法 ●Java命令行程序密码屏蔽方法 2 利用AWT组件实现密码屏蔽输入 Java抽象窗口工具包(Abstract Window Toolkit,AWT)是在JDK1.0版本中定义的用于编写Java图形用户界面程序的应用程序设计接口,程序设计人员可以利用该包中定义的多种类型组件对象,编写具有用户界面的应用程序。 为了实现用户输入信息的屏蔽,可以利用AWT组件库中定义的TextField对象,该对象的定义继承结构如下: java.lang.Object | +--java.awt.Component | +--java.awt.TextComponent | +--java.awt.TextField 在该对象中,定义了用于设置和维护用户输入字符回显方式的方法,这些方法的定义形式为: char getEchoChar():获取用户定义的文本区回显字符; boolean echoCharIsSet()判断是否定义了回显字符; void setEchoChar(char c):设置文本区回显字符为字符c。 因此,在读者编写的Java程序中,可以在创建TextField对象实例后,例如上述方法控制文本区回显字符的方式。下面的程序完整地演示了回显字符的定义方式: //PasswordMaskingDemo.java import java.awt.*; import java.awt.event.*; import javax.swing.JOptionPane; 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("", 8); txtUsername.setEditable(false); txtPassword.setEchoChar('*'); Button btnButton1 = new Button("登录"); Button btnButton2 = new Button("其它用户登录"); Button btnButton3 = new Button("关闭"); btnButton1.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { if( (txtPassword.getText()).length() == 0 ) { JOptionPane.showMessageDialog (frmFrame, "密码不能为空"); return; } txtPassword.setColumns(16); System.out.println("Anyomonus用户的密码:" + txtPassword.getText() ); } }); btnButton2.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { txtUsername.setEditable(true); } }); btnButton3.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); pnlPanel.add(lblUsername); pnlPanel.add(txtUsername); pnlPanel.add(lblPassword); pnlPanel.add(txtPassword); pnlPanel.add(btnButton1); pnlPanel.add(btnButton2); pnlPanel.add(btnButton3); frmFrame.add(pnlPanel); frmFrame.setTitle("演示TextField对象的应用方法"); frmFrame.pack(); frmFrame.show(); } } 该程序运行的窗口形式如下图所示: 图1 PasswordMaskingDemo.java程序运行窗口 在上述程序中,与文本区回显控制相关的代码为: final TextField txtPassword = new TextField("", 8); txtPassword.setEchoChar('*'); 在上面的代码中,首先创建初始内容为空、可输入8个字符的TextField对象实例txtPassword后,利用TextField对象中定义的setEchoChar方法设置该文本区的回显字符为星号"*",从而实现输入字符的掩码。因此总结为:可以利用TextField对象中定义的setEchoChar方法,实现AWT组件对象程序中的字符掩码输入和回显控制。 3 利用JSwing组件对象实现密码屏蔽输入 JSwing组件对象是轻量级Java组件对象,其中定义了多种组件对象类型,而且其外观也更加新颖。与AWT组件对象相对应,在JSwing组件对象中也定义了JTextField对象,用于用户进行文本输入。那么,读者是否会联想利用对象中也定义的setEchoChar方法定义回显字符呢?实际情况不是这样。在JTextField对象中没有定义该方法,而是以JTextField为父对象,定义了用于进行密码输入的文本区对象JPasswordField,该对象的定义继承结构如下: java.lang.Object | +--java.awt.Component | +--java.awt.Container | +--javax.swing.JComponent | +--javax.swing.text.JTextComponent | +--javax.swing.JTextField | +--javax.swing.JPasswordField 在JPasswordField对象中,定义了多种类型 |