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

Java 如何在jsp中使用查询获取用户角色?,java,mysql,jsp,switch-statement,user-roles,Java,Mysql,Jsp,Switch Statement,User Roles,我是java新手,我希望使用switch语句进行基于角色的访问,但当我执行查询并提供用户角色(例如用户或管理员)时,用户会很好地登录,但如果我离开(角色=“”)查询中为空,然后查询执行得不太好,跳转到else语句中。第二,如果我使用准备好的语句,那么我如何获得用户角色谢谢。这是我的代码 <% String userid = request.getParameter("username"); String pwd = request.getParameter("password

我是java新手,我希望使用switch语句进行基于角色的访问,但当我执行查询并提供用户角色(例如用户或管理员)时,用户会很好地登录,但如果我离开(角色=“”)查询中为空,然后查询执行得不太好,跳转到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。Servlet是真正的Java类,因此更易于编写和测试

您在查询中连接用户输入字符串而不使用预处理语句(但我承认您注意到了:-))千万不要那样做,这是SQL注入的一个开放陷阱(只有谷歌可以做到)

您可以在数据库中存储明文密码。好的实践建议只存储密码的不可逆散列。如果数据库受损,攻击者将无法获取密码

您在查询中施加
role='
。如果你能找到一个
管理员
角色,我会非常惊讶

您可以使用该角色选择重定向到哪个页面。这本身并不是一种不好的做法,但如果您不测试该用户在重定向页面中是否具有有效的角色,则可能是一种不好的做法。通常的用法是只有一个页面,其中的部分仅根据角色显示(
JSP中的blocs)

什么是
rs.getInt(rolle)
?您可以从结果集中获得rolle,直接使用它并在执行任何
rolle.equals(…)
(NPE不远)之前测试它是否为null

对于准备好的报表,您可以执行以下操作:

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
}

st.executeQuery(“从用户中选择*,其中uname=”“+userid+”,pass=”“+pwd+”,role=”);SQL injection Source如果您没有传递任何角色,那么您可以将其重定向到users.jsp,并且您的控件不应该来自JDBC代码。我在角色后加上双引号,它显示错误如果我放置用户角色,那么如何执行switch语句,因为我应该为多个角色编写多个查询。这不是一个好的做法?非常感谢,请分享任何相关示例的链接,以便于清楚理解。请告诉我,如果我只使用上述准备好的语句而不使用角色,那么我如何使用switch语句。thanks@Balajeet,您正在混淆输入和输出查询参数。请看我的编辑。非常感谢您的指导。