2014-02-14 66 views
0

我遇到了我的登錄驗證代碼問題。我有以下驗證登錄的代碼:JSP Servlet登錄問題

String customer_number=request.getParameter("customerNumber"); 
String Passphrase=request.getParameter("passphrase"); 

Class.forName("com.mysql.jdbc.Driver"); 
java.sql.Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","db_erewhon"); 
Statement st= con.createStatement(); 
ResultSet rs=st.executeQuery("select * from Customers where customer_number='"+customer_number+"'"); 
if(rs.next()) 
{ 
    if(rs.getString(2).equals(Passphrase)){ 
      out.println("Welcome"+customer_number); 

    } 
    else 
     { 
      out.println("Customer ID or Passphrase are Invalid. Please try again"); 
     } 
    } 

我得到的customer_number無法解析並且密碼相同。有任何想法嗎?所有的變量通過包括銀行數據庫在內都是正確的。

+0

這是一個現實世界的應用程序,或只是一些測試,以瞭解JSP? –

+0

這是一個小型的個人項目,不會用於公共用途。 – Softey

+0

我不想粗魯,但這是一個完美的例子,你不應該這樣做:使用scriptlets,不尊重命名約定,不縮進代碼,不使用準備好的語句,在會話中填充隨機事物,打開每個請求都有一個新連接,並且永遠不會關閉它。首先使用servlet而不是JSP來編寫Java代碼,至少編譯器會發現你的語法錯誤。 –

回答

3

的問題是在這裏:

session.setAttribute("customer_number",customer_number); 

您還沒有定義的變量,直到下一個聲明:

String customer_number=request.getParameter("customer_number"); 

一個可能的解決方案來聲明和初始化變量,然後將其保存進入會議:

String customer_number=request.getParameter("customer_number"); 
session.setAttribute("customer_number",customer_number); 

由於您正在學習JSP和Servlet,因此您應該首先了解to not use scriptlets in JSP。知道這些之後,你應該將業務邏輯轉移到一個控制器類中,例如一個Servlet。 servlet必須處理業務邏輯和其他操作以處理數據,如登錄驗證(應通過POST請求訪問,而不是GET請求),然後它應激發對視圖的響應,例如,通過轉發到一個JSP文件。

此外,你應該使用而不小心地打開數據庫連接:

Class.forName("com.mysql.jdbc.Driver"); 
java.sql.Connection con = 
    DriverManager.getConnection("jdbc:mysql://localhost:3306/test","db_customer_number","db_Passphrase"); 

而是使用一個數據庫連接池和DataSource。你可以在這裏看到更多的信息:Is it a good idea to put jdbc connection code in servlet class?

最後但並非最不重要的一點,您應該使用PreparedStatement來查詢需要傳遞參數的查詢。這是爲了防止SQL Injection attacks。你可以閱讀更多關於如何在這裏使用PreparedStatementJava - escape string to prevent SQL injection

相關問題:Creating a user object from login parameters

+0

感謝您對我出錯的全面封面,我會嘗試遵循它。 – Softey