2014-02-11 160 views
1

這是我的用戶驗證頁面。 我想在檢查用戶密碼和ID後傳遞ArrayList中的用戶名。 之後,我想在主頁面顯示名稱,但是, 我在我的主頁中獲得了空值。 如何在ArrayList中添加用戶名?將值傳遞給arraylist

// DwB: I love sql injection attacks - this is bad. 
rs=st.executeQuery("select * from registration where U_ID='"+ 
    U_ID+"' and Pass='"+Pass+"' "); 
while(rs.next()){ 
    na1=rs.getString("U_ID"); 
    pw=rs.getString("Pass"); 
    Name=rs.getString("U_N");} 

    if((U_ID.equals(na1))&&(Pass.equals(pw))){ 
     HttpSession session=request.getSession(); 
     //List<String> user= new ArrayList<>(); 
     //String id=(String)session.getAttribute("ID"); 

     //session.setAttribute("loggedIn",Name); 

     String username = request.getParameter("Name"); 
     List<String> users = (List<String>)session.getAttribute("users"); 

     if(null == users) { 
      users = new ArrayList<String>(); 
     } 
     users.add(username); 
     session.setAttribute("users", users); 
     //response.sendRedirect("Welcome.jsp"); 

     request.setAttribute("U_ID",na1); 
     request.getRequestDispatcher("/Welcome.jsp").forward(request, response); 
+0

你也可以粘貼你的jsp代碼嗎? –

+0

並且您的堆棧跟蹤請 – mdewitt

+4

1)請遵守[Java命名約定](http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-135099.html#367),它們適用於一個原因。此代碼難以辨認。 2)請閱讀[SQL注入](https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java); **總是使用'PreparedStatement' **。它讓我很痛苦(還有很多其他人)在SQL查詢中看到'String'串聯。 –

回答

0

書面,從SQL注入攻擊漏洞的榮耀asside,你保證沒有加入ArrayList值時,在數據庫中未找到該用戶ID和密碼。

此代碼if((U_ID.equals(na1))&&(Pass.equals(pw)))是免費的,因爲您永遠不會去那個if語句,除非如果statuement已經是真的。您的查詢只會查找與用戶標識和密碼匹配的行。

您的問題似乎可能與區分大小寫。 考慮更新數據庫,使U_ID列全部大寫(或全部小寫) 然後適當調整用戶輸入的userid大小寫(全部大寫或全部小寫)。

看起來很好,密碼區分大小寫。

1

不知道這是工作,但這裏有一些細微的變化:

VERSION 1

rs = st.executeQuery("select * from registration where U_ID='" + uId + "' and Pass='" + pass + "' "); // changed the variables to lower case 

    while (rs.next()) { 
     na1 = rs.getString("U_ID"); 
     pw = rs.getString("Pass"); 
     name = rs.getString("U_N"); 
    } 

    if ((uid.equalsIgnoreCase(na1)) && (pass.equalsIgnoreCase(pw))) { // always compare two strings with string.equalsIgnoreCase(otherString); 
     // ... do stuff with your list 
    } 

解釋:Java中的變量應該開始爲小寫,當你比較兩個字符串,然後將它們與方法string1.euqalsIgnoreCase(string2);進行比較。該方法將逐個比較字符串中的每個字符。方法string1.equals(string2)只比較對象引用,而不是內容。

VERSION 2

rs = st.executeQuery("select U_N, COUNT(*) from registration where U_ID='" + uId + "' and Pass='" + pass + "' "); // count(*) is enough, you don't need all the data from the row + changed the variables to lower case 
    rs.next(); 
    if(rs.getInt(1)>0){ // the username/password kombination exists at least 1 times 
     // .. do stuff with your list    
     name = rs.getString("U_N"); 
    } 

解釋:它足以算在你的數據庫中的行,其中用戶ID和密碼搜索匹配。如果ResultSet已超過0行,在登錄

東西你的用戶對你的列表

HttpSession session = request.getSession(); 

    //session.setAttribute("loggedIn",Name); 
    String username = request.getParameter("Name"); 
    ArrayList<String> users = (ArrayList<String>) session.getAttribute("users"); // use ArrayList directly 

    if (users == null) { 
     users = new ArrayList<>(); // diamond operator: the type is already given in the declaration 
    } 
    users.add(username); 
    session.setAttribute("users", users); 
    //response.sendRedirect("Welcome.jsp"); 

    request.setAttribute("uId", uId); 
    request.getRequestDispatcher("/Welcome.jsp").forward(request, response); 
    if (!session.containsKey(arrayListID)) { 
    // Place the number the user entered into the session 
     session.put(arrayListID, numbersEntered); 
    } else { 
     ArrayList<Integer> list = (ArrayList<Integer>) session.get(arrayListID); 
     list.add(1 /* what you want */); 
    // Retrieve session data 
    } 

解釋:嗯,這並不能改變什麼,但我看到的是,在如─子句(空==用戶)你實例化了一個ArrayList而你鑄造之前List。雖然這是完全允許的,爲什麼不直接轉換爲ArrayList?