快捷搜索:

Java密码屏蔽输入的实现方法

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();

}

}

该法度榜样运行的窗口形式如下图所示:

screen.width-333)this.width=screen.width-333;">

图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工具中,定义了多种类型用于节制字符回显要领的措施,此中setEchoChar措施即用于定义文本区回显字符,如下面代码段所示:

… …

JPasswordField password = new JPasswordField(8);

password.setEchoChar(´*´);

… …

与AWT组件工具定义文本区的回显要领类似,上述代码创建了JPasswordField工具实例后,设置该工具的回显字符为星号"*"。然则,读者必要留意的是:在JSwing工具中,必要使用JPasswordField工具来治理用户输入文本。

4 Java敕令行法度榜样密码樊篱输入实现要领

与基于AWT或者JSwing的图形用户界面法度榜样比拟,在基于敕令行的Java法度榜样中实现密码樊篱输入要对照麻烦一些,缘故原由在于JDK没有供给任何基于文本的字符回显节制措施,是以必要编写响应的节制代码。基于通用性方面的斟酌,在本文中将编写用于樊篱用户输入的工具InputMasking,该工具的定义如下:

//InputMasking.java

import java.io.*;

public class InputMasking

{

String getPassword(String initial) throws IOException

{

MaskingThread listeningthread = new MaskingThread(initial);

Thread thread_instance = new Thread(listeningthread);

String password = "";

thread_instance.start();

while (true)

{

char input = (char)System.in.read();

listeningthread.stopMasking();

if (input == ´´)

{

input = (char)System.in.read();

if (input == ´

´)

break;

else

continue;

}

else if(input == ´

´)

break;

else

password += input;

}

return password;

}

}

该工具在后台启动线程的节制下,从系统输入设备中读取字符并对该字符进行阐发。假如碰到行停止标志,则返回该线程获取的字符串工具password。读者必然会关心后台线程工具MaskingThread的感化,该线程工具周期地刷新终端窗口,其目的在于樊篱用户输入的字符,使该字符不能够在窗口中显示出来。该线程工具的定义为:

//MaskingThread.java

import java.io.*;

class MaskingThread extends Thread

{

private boolean stop = false;

private int index;

private String initial;

public MaskingThread(String initial)

{

this.initial = initial;

}

public void run()

{

while(!stop)

{

try

{

this.sleep(1);

}

catch (InterruptedException ex)

{

ex.printStackTrace();

}

if (!stop)

{

System.out.print("" + initial + " " + initial);

}

System.out.flush();

}

}

public void stopMasking()

{

this.stop = true;

}

}

在InputMasking工具和MaskingThread工具的共同下,使得基于敕令行的Java利用法度榜样能够实现用户输入密码字符的樊篱,其核心措施是使用后台线程不时刷新终端窗口,樊篱用户输入字符。下面的CmdLineUtility工具纵然用前面定义的两个工具进行用户输入樊篱,请读者实际运行上述法度榜样,以懂得敕令行Java法度榜样樊篱输入的要领:

//CmdLineUtility.java

import java.io.*;

public class CmdLineUtility

{

public static void main(String argv[])

{

InputMasking masking = new InputMasking();

String password = null;

try

{

password = masking.getPassword("请输入登录密码: ");

}

catch(IOException ex)

{

ex.printStackTrace();

}

System.out.println("您输入的密码为: " + password);

}

}

5 停止语

本文着重解说了基于Java说话编写图形用户界面法度榜样和敕令行法度榜样中,实现用户输入字符樊篱的措施。从文中内容可以看出:对付图形用户界面法度榜样,无论使用AWT组件工具,照样使用JSwing组件工具,均可以使用响应的组件工具并调用工具实例中定义的措施,实现用户输入字符的樊篱,从而简化了代码编写难度。

对付基于敕令行的Java法度榜样,因为JDK中没有定义响应的Java工具,是以,必要编写樊篱用户输入的代码,将用户输入不显示在终端窗口中,从而实现用户输入樊篱。

本文选自:赛迪网

您可能还会对下面的文章感兴趣: