2014-11-04 65 views
0

我是新來的java我希望使用switch語句進行基於角色的訪問,但是當我執行查詢並提供用戶角色(例如用戶或管理員),然後用戶登錄並且如果我離開(角色='')然後查詢不會執行得那麼好,並跳入else語句。第二,如果我使用準備好的語句,那麼我怎麼能得到用戶角色謝謝。這是我的代碼。如何在jsp中使用查詢獲取用戶角色?

<% 
    String userid = request.getParameter("username"); 
    String pwd = request.getParameter("password"); 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/auto_lube","root", "password"); 

    Statement st = con.createStatement(); 
    ResultSet rs; 
    rs = st.executeQuery("select * from users where uname='" + userid + "' and pass='" + pwd + "' and role=''"); 

    if (rs.next()) {   
    String username = rs.getString("uname"); 
    String email = rs.getString("email"); 
    String rolle = rs.getString("role"); 
    session.setAttribute("customer_name", username); 

    int usser = rs.getInt("id"); 
    session.setAttribute("customer_id", usser); 
    switch(rs.getInt(rolle)) {     
     case 1: 
     if (rolle.equals("admin")) {     
      response.sendRedirect("adminPage.jsp"); 
      break; 
     } 

     case 2: 
     if (rolle.equals("user")) {     
      response.sendRedirect("user.jsp"); 
     } 
     break; 

     case 3: 
     if (rolle.equals("assistant")) {     
      response.sendRedirect("assistant.jsp"); 
     } 
     break; 

     case 4: 
     if (rolle.equals("supplier")) {     
      response.sendRedirect("supplier.jsp"); 
     } 
     break; 

     default: 
     break; 
    } 
    } else { 
    out.print("invalid"); 
    } 
%>   
+2

st.executeQuery(「SELECT * FROM users uname ='「+ userid +」'和pass ='「+ pwd +」'和role =''「); SQL注入源 – StanislavL 2014-11-04 06:53:15

+0

如果您沒有傳遞任何角色,那麼您可以將其重定向到users.jsp,並且您的控件不應該出現在JDBC代碼中。 – 2014-11-04 06:56:00

+0

我推後雙角色角色顯示錯誤 – 2014-11-04 06:56:59

回答

2

恭喜,您只會在一段代碼中加入很多不良做法!

你在JSP中放了很多scriptlet。你最好使用一個servlet來進行這個處理,並且只對視圖(顯示)部分使用JSP。 Servlet是真正的Java類,因此更容易編寫和測試。

您在查詢中連接用戶輸入字符串而不使用準備好的語句(但我承認您注意到它:-))。 千萬不要這麼做,它是一個開放的SQL注入陷阱(只是谷歌它)

你存儲在數據庫cleartext密碼。良好的做法建議只存儲密碼的不可逆散列。如果數據庫受到攻擊,攻擊者無法獲取密碼。

您在查詢中強加role = ''。如果你找到admin角色,我會非常驚訝!

您使用角色選擇要重定向的頁面。這本身並不是一種壞習慣,但如果您不測試該用戶在重定向頁面中具有有效角色,則可能會出現這種情況。常見用法是隻有一個頁面,其中部分僅根據角色顯示(JSP中的<c:if>區塊)。

而什麼意思rs.getInt(rolle)?您可以從結果集得到羅爾,直接罰款使用它,測試它是否做任何rolle.equals(...)前空(NPE並不遠)

對於準備好的語句,你可以這樣做:

PreparedStatement st = connection.prepareStatement("select * from users where uname=? and pass=?"); 
st.setString(1, userid); 
st.setString(2, pwd); 
ResultSet rs = st.executeQuery(); 

這樣,不僅你可以防止SQL注入,而且你可以從數據庫中獲得一條來自userid,pwd的行,無論角色是什麼。

編輯:

該查詢後,您仍然可以從users表中讀取任何屬性:

if (rs.next()) {   
    String username = rs.getString("uname"); 
    String email = rs.getString("email"); 
    String rolle = rs.getString("role"); 
    session.setAttribute("customer_name", username); 

    int usser = rs.getInt("id"); 
    session.setAttribute("customer_id", usser); 

而且測試應該

if (rolle == null || role.isEmpty()) { 
    // process no role case first - it deals with the null role problem 
} 
else if (role.equals("admin") { 
    ... 
} 
... 
else { 
    // process for unknown role 
} 
+0

感謝請分享任何相關示例的鏈接以獲得清晰的理解。 – 2014-11-04 07:20:09

+0

好心告訴我,如果我只使用上面準備好的聲明,而不使用角色,那麼我可以如何使用switch語句。謝謝 – 2014-11-04 07:25:08

+0

@Balajeet,你在輸入和輸出查詢參數之間混淆。看我的編輯。 – 2014-11-04 07:43:20