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

标签 java mysql jsp switch-statement user-roles

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

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

最佳答案

恭喜,你仅仅在一段代码中引入了很多不好的做法!

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

您在查询中连接用户输入字符串而不使用准备好的语句(但我承认您注意到了:-))。 永远不要这样做,这是一个 SQL 注入(inject)的开放陷阱(只需 google 即可)

您将明文密码存储在数据库中。好的做法建议仅存储密码的不可逆哈希值。如果数据库遭到破坏,攻击者就无法获取密码。

您强加role = ''在查询中。如果您找到admin,我会感到非常惊讶与此相关的角色!

您使用该角色来选择页面重定向。这本身并不是一个坏习惯,但如果您不测试该用户在重定向页面中具有有效角色,则可能会是一个坏习惯。常见用法是在一个页面中仅根据角色显示各个部分(<c:if> JSP 中的 block )。

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 注入(inject)的侵害,还可以从数据库中获取 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
}

关于java - 如何在jsp中使用查询获取用户角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26729208/

相关文章:

php - 未定义索引 : query in, 将 mysql 转换为 mysqli

MySQL 选择从上个月到(现在() - 1 个月)的所有行,用于比较目的

php - 无鉴别器映射的 Doctrine 单表继承

html - 编辑那些 1 像素背景图像的最佳方法是什么?

java - 重新发布不起作用(静态资源)

java - 如何配置 video.js html5-video 包装器的样式?

java - Logback:记录器功能不在控制台中打印消息。

java - 使用 facebook4j 在页面上发帖

java - 如何使用包含 Java 命名空间的 XPath 检索 XML 数据?

java - 使用递归打印大小为 n 的所有二进制数