2012-03-21 2 views
4

나는 현재 메이크업 회사의 로그인 시스템을 설계 중입니다. 현재는 메인 로그인만으로도 많은 정리가 필요합니다. 아래는 내 로그인 처리기입니다.getText() 대 getPassword()

private class LoginButtonHandler implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) { 
      JOptionPane.showMessageDialog(null, "Congratulations on logging in!"); 
     } else { 
      JOptionPane.showMessageDialog(null, "Error on login!"); 
     } 
    } 
} 

은 그대로,이 완벽하게 잘 작동하지만 내가

_pwd.getPassword.equals("password") 

로 변경하면 모든 것이 제대로 입력 할 때 그것은 다른 문으로 바로 지시합니다. 여기에 무슨 문제가 있습니까? 아래 전체 프로그램.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Main extends JFrame { 
    private static final int HEIGHT = 90; 
    private static final int WIDTH = 400; 

    JTextField _uid = new JTextField(10); 
    JPasswordField _pwd = new JPasswordField(10); 
    JButton _login = new JButton("Login"); 
    JButton _reset = new JButton("Reset"); 

    public Main() { 
     super("Login - Durptech"); 
     Container pane = getContentPane(); 
     setLayout(new FlowLayout()); 

     add(new JLabel("User ID:")); 
      add(_uid); 
     add(new JLabel("Password:")); 
      add(_pwd); 

      add(_login); 
       _login.addActionListener(new LoginButtonHandler()); 
      add(_reset); 
       _reset.addActionListener(new ResetButtonHandler()); 

     /*if(_uid.getText().equals("") && _pwd.getText().equals("")) { 
      _login.setEnabled(false); 
     } else { 
      _login.setEnabled(true); 
     }*/ 

     setSize(WIDTH, HEIGHT); 
     setResizable(false); 
     setLocation(500, 300); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    private class ResetButtonHandler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      _uid.setText(""); 
      _pwd.setText(""); 
      _uid.requestFocusInWindow(); 
     } 
    } 

    private class LoginButtonHandler implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      if(_uid.getText().equalsIgnoreCase("Nathan") && _pwd.getText().equals("password")) { 
       JOptionPane.showMessageDialog(null, "Congratulations on logging in!"); 
      } else { 
       JOptionPane.showMessageDialog(null, "Error on login!"); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new Main(); 
    } 
} 
+0

내가 자바 모르겠지만, 관련이있을 수있는 괄호가 없다고 생각하십시오. – Ryan

+0

여기 스윙에서 로그인 화면을 만드는 방법에 대한 간단한 자습서가 있습니다. http://www.thepcwizard.in/2011/10/create-login-form-using-netbeans-ide.html – ThePCWizard

답변

5

password.getPassword()은 char []를 반환하고 char []은 Strings와 다릅니다. 그래서 당신은 문자 []와 비교해야합니다 당신이하려면 getPassword() 메서드를 호출 할 때

모든 다른 답변이 말했듯이
if (Arrays.equals(password.getPassword(), new char[]{'p','a','s','s','w','o','r','d'})) 
+2

이것에 대해 확실합니까?나는 배열이 메소드를 오버라이드하지 않기 때문에 equals가 한 배열을 다른 배열과 비교하는 것에 대해 효과가 없을 것이라고 생각하지 않는다. 그리고 객체 평등 ('==')을 수행하는 Object 클래스에 대해 디폴트 평등 방법을 사용하게된다. 대신 java.util.Arrays # equals (...) 또는 java.util.Arrays # deepEquals (...) 메소드를 사용하십시오. –

+1

@HovercraftFullOfEels 물론, 바보 같은 날, 고마워. 편집을 참조하십시오. – EJP

+1

그리고 "password".toCharArray()를 사용하여 실수가 아닌 경우'getPassword' 또는'getText' 메서드 사용 여부와 상관없이 문자열 풀에 암호를 넣습니다. – Robin

11

API를 가장 잘 알기를 원할 것입니다. 이를 해결하는 열쇠는 JPasswordField#getPassword()이 무엇을 반환하는지 확인하는 것입니다. 힌트 1 : String이 아닙니다. 힌트 2 : 당신은 java.util.Arrays 클래스 메소드를 사용하여 이것을 해결할 수있다.

getPassword가 String을 반환하지 않는 이유는 Java가 String을 처리하는 방식 때문입니다. 문자열 풀에 문자열을 저장할 수 있기 때문에 문자열이 예상보다 오래 프로그램에 들어갈 수 있고 잠재적으로 맬웨어가 검색 할 수있는 문자열 - 암호에 대해 원하지 않는 문자열. char 배열로 작업하는 것이 훨씬 안전합니다.

덧붙여서 getText() 메서드를 사용하는 JPasswords를 사용하거나 new String(char[]) 생성자를 사용하여 char 배열을 String으로 변경하지 마십시오. 둘 다 String을 반환하므로 보안되지 않습니다.

10

JPasswordField.getPassword()String 대신 char []을 반환합니다. 이는 보안을 위해 수행됩니다. char [] .equals (String);이 아닌 배열의 문자를 비교해야합니다.

1

는 JPasswordField의는 문자 []를 반환합니다. 그러나 양식의 샘플 로그에 설정 한 방법은 입력의 유효성을 검사하는 방법입니다. 나는 사용자 이름 []과 패스워드 []를 저장하기 위해 두 개의 배열을 가지고있다. 그리고 나는 나의 사용자 이름 입력과 패스워드 입력을 가지고있다. 내 방식의 암호를 입력하면 다음과 같이 수행 할 수 있습니다, 계속하기 전에 문자열로 문자 []를 변경합니다

String PasswordTyped = new String(_pwd.getPassword()); 

그런 다음 해당 문자열을 가지고 배치 당신의 '경우'문의 :

if (_uid.equals("Nathan") && PasswordTyped.equals("password") { 
    JOptionPane.showMessageDialog(null, "Congrats, you logged in as Nathan"); 
} 

그러나 입력란에 문자열과 char []를 허용하면서 사용자 이름 []과 암호 []의 두 배열에서 유효성 검증 메소드를 실행한다고 언급 했었습니다. 내가 복사하고 당신이 좋아하면 당신이 그것을 연루 수 있도록 내 방법을 붙여 넣습니다 :

public static void validate(String u, Char[] pass) { 
    String password = new String(pass); 
    boolean uGood = false; 
    String[] usernames = new String[2]; 
    String[] passwords = new String[usernames.length]; 

    usernames[0] = "Don"; 
    passwords[0] = "password"; 
    usernames[1] = "Jared"; 
    passwords[1] = "password"; 


    for (int i = 0; i < usernames.length; i++) { 

     if (usernames[i].equals(u) && passwords[i].equals(password)) { 
      uGood = true; 
     } 
    } 
    if (uGood) { 
     System.out.println("Hooray, you did it!"); 
    } 
    else { 
     JOptionPane.showMessageDialog(null, "Incorrect Username\nand/or Password."); 
    } 
} 

을 마지막으로,이 검증 메서드를 호출 할 입력 :

validate(_uid.getText(), _pwd.getPassword());