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个字符的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 象,因此,需要 写屏蔽用 户输 入的代 ,将用 户输 入不 示在 端窗口中,从而 实现 户输 入屏蔽。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值