如何在jsp中使用查询获取用户角色?

时间:2014-11-04 06:45:48

标签: java mysql jsp switch-statement user-roles

我是java新手我希望使用switch语句进行基于角色的访问但是当我执行查询并提供用户角色时(例如用户或管理员)然后用户登录很好但是如果我离开(role ='')为空查询然后查询不能很好地执行并跳转到else语句。如果我使用预准备语句,那么我如何获得用户角色thanks.Here是我的代码。

<%
  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");
  } 
%>         

1 个答案:

答案 0 :(得分:2)

恭喜,您只在一段代码中添加了许多不良做法!

你在JSP中放了很多scriptlet。您最好使用servlet进行此处理,并且仅将JSP用于视图(显示)部分。 Servlet是真正的Java类,因此更容易编写和测试。

您在查询中连接用户输入字符串而不使用预准备语句(但我承认您注意到它:-))。 从不这样做,它是SQL注入的开放陷阱(只是google for it)

您在数据库中存储明文密码。良好做法建议仅存储密码的非可逆哈希值。如果数据库遭到入侵,则攻击者无法获取密码。

您在查询中强制使用role = ''。如果你找到admin角色,我会非常惊讶!

您可以使用该角色选择要重定向的页面。它本身并不是一种不好的做法,但如果您不测试该用户在重定向页面中具有有效角色,则可能是这样。常见的用法是只有一个页面,其中的部分仅根据角色(JSP中的<c:if>块)显示。

rs.getInt(rolle)是什么意思?你可以从结果集中得到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注入,而且可以从useridpwd获得一行代码,无论角色是什么。

编辑:

在该查询之后,您仍然可以从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
}