2013-05-31 5 views
0

준비된 명령문이 null을 반환하는 이유는 누구나 제게 밝혀 주시겠습니까?JDBC PreparedStatement가 NullPointerException을 던졌습니다.

:
<jsp:useBean id="user" class="beans.ConnectToDB" scope="session" /> 
<jsp:useBean id="aes" class="beans.AES" scope="session" /> 

String getUsername = request.getParameter("username"); 
     String getPassword = request.getParameter("password"); 

     final String passphrase = "#[email protected]#";  
     byte[] password_byte = getPassword.getBytes(); 
     byte[] passphrase_byte = passphrase.getBytes(); 
     byte[] encrypt_password = aes.encrypt(password_byte, passphrase_byte);  

     if((getUsername != null && !getUsername.isEmpty()) || (getPassword != null && !getPassword.isEmpty())){ 
      String username_from_db = user.getUsername(getUsername); 
      String password_from_db = user.getPassword(getUsername); 

      byte[] pass_db_byte = password_from_db.getBytes(); 
      byte[] encrypted_pass_db = aes.encrypt(pass_db_byte, passphrase_byte); 

      if(getUsername.equalsIgnoreCase(username_from_db) && encrypt_password.equals(encrypted_pass_db)){ 
       response.sendRedirect("home_page.jsp"); 
      } 
     } 
     else{ response.sendRedirect("index.jsp"); } 

내가 여기 null을 반환 getUsername(String username) 메서드를 호출

가 발생 예외 : 여기 그런

package beans; 
import java.sql.*; 
public class ConnectToDB { 
private Connection connect; 

private final String url = "jdbc:mysql://localhost/"; 
private final String DBuser = "root"; 
private final String DBpass = "root"; 
private final String DBname = "reservation"; 

private final String Driver = "com.mysql.jdbc.Driver"; 
public ConnectToDB(){ 
    try{ 
     Class.forName(this.Driver); 
     this.connect = DriverManager.getConnection(this.url+this.DBname, this.DBuser, this.DBpass); 
    }catch( ClassNotFoundException | SQLException e){ e.printStackTrace(); } 
} 
public Connection getConnection(){ 
    return this.connect; 
} 

private String get_user_info(String username,int index){ 
    /* 
    * user_info[0] = user_id; 
    * user_info[1] = username; 
    * user_info[2] = password; 
    * user_info[3] = firstname; 
    * user_info[4] = middle_name; 
    * user_info[5] = lastname; 
    * user_info[6] = client_rights; 
    * 
    */ 
    String user_info[] = new String[7]; 
    PreparedStatement pstmt = null; 
    ResultSet rset = null; 
    String query = null; 
    try{ 
     query = "Select * from user where username = ?"; 
     pstmt = this.connect.prepareStatement(query); 
     pstmt.setString(1, username); 
     rset = pstmt.executeQuery(); 
     while(rset.next()){ 
      int user_id = rset.getInt("user_id"); 
      user_info[0] = String.valueOf(user_id); 
      user_info[1] = rset.getString("username"); 
      user_info[2] = rset.getString("password"); 
      user_info[3] = rset.getString("firstname"); 
      user_info[4] = rset.getString("middle_name"); 
      user_info[5] = rset.getString("lastname"); 
      user_info[6] = rset.getString("user_rights"); 
     } 
    }catch(SQLException e){ e.printStackTrace(); } 
    finally{ 
     try{ 
      pstmt.close(); 
      rset.close(); 
     }catch(SQLException e){ e.printStackTrace(); } 
    } 
    return user_info[index]; 
} 

public int getUserId(String username){ 
    String user_id_from_db = get_user_info(username, 0); 
    int user_id = Integer.parseInt(user_id_from_db); 
    return user_id; 
} 

public String getUsername(String username){ return get_user_info(username, 1); } 
public String getPassword(String username){ return get_user_info(username, 2); } 
public String getFirstname(String username){ return get_user_info(username, 3); } 
public String getMiddlename(String username){ return get_user_info(username, 4); } 
public String getLastname(String username){ return get_user_info(username, 5); } 
public String getUserRights(String username){ return get_user_info(username, 6); } 

public boolean userExists(String username){ 
    boolean queryStatus = false; 
    if(username.equalsIgnoreCase(getUsername(username))) 
     queryStatus = true; 
    else 
     queryStatus = false; 
    return queryStatus; 
} 
} 

쿼리를 호출하는 코드입니다 : 여기에 데이터베이스를 쿼리 코드입니다

org.apache.jasper.JasperException: An exception occurred processing JSP page /authenticate_user.jsp at line 29 
26:    byte[] encrypt_password = aes.encrypt(password_byte, passphrase_byte);  
27:    
28:    if((getUsername != null && !getUsername.isEmpty()) || (getPassword != null && !getPassword.isEmpty())){ 
29:     String username_from_db = user.getUsername(getUsername); 
30:     String password_from_db = user.getPassword(getUsername); 
31: 
32:     byte[] pass_db_byte = password_from_db.getBytes(); 


Stacktrace: 
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

root cause 

java.lang.NullPointerException 
beans.ConnectToDB.get_user_info(ConnectToDB.java:61) 
beans.ConnectToDB.getUsername(ConnectToDB.java:72) 
org.apache.jsp.authenticate_005fuser_jsp._jspService(authenticate_005fuser_jsp.java:110) 
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) 
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
+1

? 또한 JSP는 문제 (IMHO) – SJuan76

+0

을 이해하는 데 필요하지 않습니다. 줄 61은 get_user_info 메소드의 finally 블록 안에있는 rset.close()입니다. – tonix15

답변

1

너무 많이 게시했습니다.

당신이 필요로하는 모든

은 이것이다 :
beans.ConnectToDB.get_user_info(ConnectToDB.java:61) 

는 텍스트 편집기에서 ConnectToDB.java을 열고 61 라인, 그리고 그 라인에있는 모든 개체 참조를 검사 할 수 있어요. 그 중 하나는 제대로 초기화하지 않았거나 가져 왔을 때 항상 null이 아닌 것으로 가정했기 때문에 null입니다. 어떤 것을 추출하고 올바르게 초기화하십시오. 문제 해결됨.

나는 이것이 좋은 해결책이라고 생각하지 않습니다. JSP가있는 경우 JNDI 데이터베이스 연결 풀과 이름 지정 서비스가 있어야하는 서블릿/JSP 엔진이 있습니다. 이를 설정하고 데이터베이스 연결 매개 변수를 외부화해야합니다. 그들은 당신의 코드에 속하지 않습니다. 수영장이 당신보다 더 잘 연결을 관리 할 것입니다.

리소스를 올바르게 종료하지 못했습니다. finally 블록에서 개별 try/catch 블록으로 싸여진 생성의 역순으로 닫혀 야합니다. 그것을 호출 할 수있는 정적 유틸리티 메서드를 작성합니다.

package persistence; 

public class DatabaseUtils { 
    private DatabaseUtils() {} 

    // Similar for ResultSet and Connection 
    public static void close(Statement st) { 
     try { 
      if (st != null) { 
       st.close(); 
      } 
     } catch (Exception e) { 
      // Log the exception 
     } 
    } 
} 
+0

귀하의 말은 풀링 된 연결로 데이터베이스 연결을 변경하겠습니까? 이거? [풀링 된 연결] (http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-j2ee-concepts-connection-pooling.html) – tonix15

+0

당신은 그렇게 할 수도 있지만, 그것은 당신의 즉각적인 것이 아닙니다 문제. – duffymo

+1

Java 7을 사용한다면, try-with-resources를 사용하십시오. Java 6 이하를 사용하고 있다면, 코드를 저장하고 commons-db의'DbUtils.closeQuietly()'메소드를 사용하십시오.또한 암호화 된 경우에도 암호를 데이터베이스에 저장하는 것처럼 보입니다. 이로 인해 응용 프로그램이 사전 공격에 취약 해집니다. 대부분의 사용자는'password'와 같은 비열한 암호를 선택하고, 공격자는이를 사용하여 시스템에 침입 할 수 있습니다. * salting * 및 * hashing *을 사용하십시오. 보안 가이드는 이러한 용어를 설명 할 수 있습니다. 사용자 개체에 암호를 저장하는 것을 원하지 않습니다. –

0

예외는 이전에 발생한 예외입니다. 예외는 try/catch 블록의 첫 번째 라인에서 발생합니다 :

pstmt = this.connect.prepareStatement(query); 
    pstmt.setString(1, username); 
    rset = pstmt.executeQuery(); 

는 그래서 더 값이 실행을 시작 finally 블록 전에 rset로 설정되어, 당신은 null 값으로 작업하려고으로 새로운 예외가 발생합니다. 모든 예외를 캡처하도록 catch을 변경하면 근본 원인을 찾을 수 있습니다. finally 또는 catch 블록 작업을 수행 할 때

그리고 물론

는, 예외가 후 발생 된 경우 try 블록의 모든 코드가 실행 된 것입니다하지 않는 것이 마음은, 어쩌면 약간의 변수는 정의되지 않습니다.

당신이 자바 7을 사용하는 경우, 당신이 사용할 수 있다고

참고 try with resources : 또한 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

, 라인 (61)이다 Exception thrown in catch and finally clause

+0

이 api executeQuery()에 따라 [executeQuery()] (http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html#executeUpdate())는 insert update 여야합니다. 또는 삭제, 내가 선택한 쿼리를 사용하고, 이것이 null을 반환하는 이유는 무엇입니까? – tonix15

관련 문제