Маскировка паролем не останавливает программу при необходимости - PullRequest
0 голосов
/ 06 октября 2010

Я разработал следующее приложение, в котором мне нужно было маскировать ПИН-код и завершить работу программы после того, как пользователь трижды ввел неправильный ПИН-код. Тем не менее, программа завершается, только если я закрываю stopThread в начале (я прокомментировал это в приведенном ниже коде), однако при этом не происходит маскирование пароля для всех трех каналов. Но когда я закрываю stopThread непосредственно перед отображением экрана успешного входа в систему, программа не завершает работу. Мне нужно использовать Ctrl + C, чтобы завершить программу.

Любая помощь очень ценится.

boolean stopThread = false;
boolean hideInput = false;
boolean shortMomentGone = false;
public static double userBal=0.0D;

public void run(){
    try{
        sleep(500);
    } catch(InterruptedException e){
    }
    shortMomentGone = true;
    while(!stopThread){
        if(hideInput){
            System.out.print("\b*");
        }
        try{
            sleep(1);
        } catch(InterruptedException e){
        }
    }
}

public static final int NB_OF_TRIES = 3;        

public void validatePin(){
    BankAccount getAll=new BankAccount();
String pin="";
    getAll.Login();
    Login hideThread =new Login();
    hideThread.start();
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    try{    
    do{

        } while(hideThread.shortMomentGone == false  );          
    // Now the hide thread should begin to overwrite any input with "*"
        hideThread.hideInput = true;            // Read the PIN
        System.out.println("\nPIN:");

    boolean pinMatch = false;
        int i = 0;

    while(!pinMatch && i < NB_OF_TRIES) {
        hideThread.hideInput = true;
        pin = in.readLine();
    i++;
        //hideThread.stopThread = true;       //Program terminates after third attempt 
                                              //PIN masking is stopped, if uncommented
        System.out.print("\b \b");        
        if(pin.equals(" ")){
    System.out.println("Please do not leave unnecessary spaces!");
    getAll.Login();
    }else if(pin.equals("")){
    System.out.println("Please do not press the enter key without entering the PIN!");
        getAll.Login();
    }

    FileInputStream fileinputstream = new FileInputStream(".\\AccountInfo.txt");
        DataInputStream datainputstream = new DataInputStream(fileinputstream);
        BufferedReader bufferedreader1 = new BufferedReader(new InputStreamReader(datainputstream));

    do
        {
            String s1;
            if((s1 = bufferedreader1.readLine()) == null)
            {
                break;
            }
            if(s1.trim().charAt(0) != '#')
            {
                String as[] = s1.split(" ");
                if(pin.equals(as[0]))
                {          
                    System.out.println("You have login!");
                    String s2 = as[2];
                    userBal = Double.parseDouble(s2);                       
                    getAll.balance = userBal;
                hideThread.stopThread = true;
                    getAll.MainMenu();
        System.exit(0);
                }else if(pin != as[0]){
        System.out.println("Invalid PIN!");
        getAll.Login();           
        System.out.println("\n NOTE :- You are only allowed to enter the PIN THREE times. The number of tries remaining before your card is blacklisted are "+i + "\n Please re-enter your PIN");
                }
            }
        } while(true);
        datainputstream.close();    
    }//End of While Loop

    }catch(Exception exception)
    {
        System.err.println((new StringBuilder()).append("Error: ").append(exception.getMessage()).toString());
    }//End of try-catch block    
}

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

В java.io.Console есть метод readPassword (), используйте его.Зачем вообще нужна отдельная тема?Это делает все слишком сложным.

Относительно вашего вопроса, почему это не закрывается: Java может оптимизировать while(isTrue){} до чего-то вроде if(isTrue) { while(true) { } }, если вы не установите isTrue volatile или синхронизируете доступ к isTrue (getter / setter),Эта оптимизация называется подъемом и объясняется в Effective Java SE, пункт 66.

Вот статья, которая точно объясняет вашу проблему: эхо * вместо пробелов.http://java.sun.com/developer/technicalArticles/Security/pwordmask/ Они тоже идут сложным путем, но это работает.Я предпочел бы пропуски над звездочками, так как это более легкий путь.Не повторяется * это * nix стандартное afaik.

0 голосов
/ 06 октября 2010

На самом деле после того, как я проанализировал это, но я понял, что причина, по которой система не прекратит работу, заключается в том, что она не хранится в надлежащем месте. Следовательно, решением было бы завершить программу, как только цикл while будет закрыт, и тогда все будет работать нормально.

        } while(true);
        datainputstream.close(); 
 }//End of While Loop
     System.exit(0);  // After the system is closed the program would terminate after the third attempt
    }catch(Exception exception)
    {
        System.err.println((new StringBuilder()).append("Error: ").append(exception.getMessage()).toString());
    }//End of try-catch block
...