我看到在DOS 下链接FTP站点时输入密码的时候密码根本连星号也不显示,光标只是在原位置闪动,回车后就进行验证了,这样安全性很高连密码的位数也不知道了,不知道在Java的命令行如何用实现?  请高手指点一下,这里先谢了~~~

解决方案 »

  1.   

    自己写吧,
    每次System.in.read()后在屏幕上打一个"*"或者什么也不做就可以了
      

  2.   

    http://developer.ccidnet.com/pub/disp/Article?columnID=993&articleID=48548&pageNO=1
      

  3.   

    Java密码屏蔽输入的实现方法
    ( 苏洋 2003.06.03 15:33:52  本文选自:赛迪网 )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对象中,定义了多种类型用于控制字符回显方式的方法,其中setEchoChar方法即用于定义文本区回显字符,如下面代码段所示: … …
    JPasswordField password = new JPasswordField(8);
    password.setEchoChar('*');
    … …
     
      与AWT组件对象定义文本区的回显方式类似,上述代码创建了JPasswordField对象实例后,设置该对象的回显字符为星号"*"。但是,读者需要注意的是:在JSwing对象中,需要利用JPasswordField对象来管理用户输入文本。 入屏蔽
      

  4.   

    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 == '\r') 
                     {
                           input = (char)System.in.read();
                           if (input == '\n') 
                               break;                
                           else                
                               continue;                
                     }
                     else if(input == '\n')             
                               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("\r" + initial + " \r" + 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对象,因此,需要编写屏蔽用户输入的代码,将用户输入不显示在终端窗口中,从而实现用户输