济南网页设计|自助建站济南网站建设|聊城网站建设济南网站制作|济南网站优化 http://www.mzwkj.com www.tuanqv.com

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

1 前言

  大家知道,在登Microsoft Windows操作系统过程中,在登窗口中需要用户输入注册用名称和密心的者会发现:用户输入的注册用名称内容字符示,而注册密内容字符示。例如,同在两各文本区中入字符"a",在用名文本区中示的是字符"a",而在密区中示的字符"*"就是所的密屏蔽入。将入的密屏蔽回,不了用私有信息的安全性,更重要的是维护算机系定性和安全性。


  Java以其言的面向象能力、高安全性和Java平台的系性等技术优势,在商务软开发过程中得了众多程序设计的青JDKAWTJFC类库中定了用于密字符屏蔽的用程序设计接口(API),使用系统开发形用界面程序,能灵活地定方式。但是,于基于命令行方式的Java用程序,JDK没有定的密屏蔽策略,程序设计须编写字符回控制代。本文将通过对实例代的分析,基于JDK平台开发Java用程序的密屏蔽入方法行探,主要内容包括:


  ●AWT象密屏蔽方法


  ●JSwing象密屏蔽方法


  ●Java命令行程序密屏蔽方法




  2 利用AWT实现屏蔽


  Java抽象窗口工具包(Abstract Window ToolkitAWT)是在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个字符的TextFieldtxtPassword后,利用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象,因此,需要写屏蔽用户输入的代,将用户输入不示在端窗口中,从而实现户输入屏蔽。  

posted on 2006-09-01 17:34  路大侠  阅读(805)  评论(0)    收藏  举报

导航

济南户外拓展|企业户外拓展 http://www.tuanqv.com