我想使用servlet创建一个登录页面

1 java mysql jsp servlets jdbc

我想使用Servlet和JSP创建一个登录页面.

我创建了一个获取用户名和密码的页面.

我创建了一个包含用户名和密码的表的数据库.

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit">
</form> 
Run Code Online (Sandbox Code Playgroud)

我在doPost()中输入了以下代码

 response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    String userName = request.getParameter("userName").toString();
    String passWord = request.getParameter("password").toString();
    Connection con = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "userdb";
    String driver = "com.mysql.jdbc.Driver";
    String user = "root"; 
    String password = "1234";
    try {
        Class.forName(driver).newInstance();
        Connection conn = DriverManager.getConnection(url+dbName, user, password);
        PreparedStatement pstmt;
        String sql = "SELECT USR_NAME FROM LOGIN WHERE USR_NAME='userName'";
        pstmt = conn.prepareStatement(sql);
        ResultSet rs=pstmt.executeQuery();
        String usr = null;
        String pass = null;
        while(rs.next())
        {
            pass = rs.getString(3);
        }
        if(pass != null && pass.equals(passWord))
        {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Login Sucessfull</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Login Sucessfull " + request.getContextPath () + "</h1>");
            out.println("<p>Welcome</p> " + userName);
            out.println("</body>");
            out.println("</html>");

            out.close();
        }

    } catch (Exception e) {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Login is not Sucessfull</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Login is not Sucessfull " + request.getContextPath () + "</h1>");
        out.println("<p>Wrong Username Or Password</p> ");
        out.println("</body>");
        out.println("</html>");

        out.close();
Run Code Online (Sandbox Code Playgroud)

我不知道如何使它工作.有什么快速修复可供我使用吗?

它不是一个大项目,我想要一个获取用户名和密码的登录页面,然后servlet将在DB中搜索用户名然后检查密码.我已经做了你们所说的改变.但是输出看起来像try块中的错误,因为,我得到了Login not successful页面.我在Catch块中输入了代码"Login not successful Page".

Bal*_*usC 6

目前还不清楚你对"如何让它发挥作用"的意思.怎么了?怎么回事?至少我可以在你的代码中发现几个问题:

  1. 您在servlet中发出HTML.您应该使用JSP.
  2. 您正在泄漏JDBC资源.你需要关闭它们finally.
  3. 您没有在SQL字符串中设置输入的用户名(和密码).
  4. 您不是让DB执行比较密码的任务.把它添加到WHERE.
  5. 你吞下这个例外.有关问题原因的所有详细信息都会丢失.您应该重新抛出它,ServletException或者至少记录异常类型,消息和原因.这些信息很重要,因为它告诉了问题的根本原因.您知道,一旦理解了根本原因,解决方案就很明显了.

此外,如果您将页面更改为用户除了面对错误消息之外什么都不做的页面,这也是糟糕的用户体验.用户必须进行额外处理才能返回登录页面以重新输入详细信息.而是使用内联的错误消息重新显示同一页面.

重写您的doPost()方法如下:

String userName = request.getParameter("userName");
String passWord = request.getParameter("password");

String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/";
String dbName = "userdb";
String user = "root"; 
String password = "1234";
String sql = "SELECT * FROM LOGIN WHERE USR_NAME = ? AND USR_PASS = ?"; // Not sure how the password column is named, you need to check/update it. You should leave those ? there! Those are preparedstatement placeholders.

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
boolean login = false;

try {
    Class.forName(driver); // You don't need to call it EVERYTIME btw. Once during application's startup is more than enough.
    connection = DriverManager.getConnection(url + dbName, user, password);
    statement = connection.prepareStatement(sql);
    statement.setString(1, userName);
    statement.setString(2, password);
    resultSet = statement.executeQuery();
    login = resultSet.next();
} catch (Exception e) {
    throw new ServletException("Login failed", e);
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

if (login) {
    request.getSession().setAttribute("username", userName); // I'd prefer the User object, which you get from DAO, but ala.
    response.sendRedirect("home.jsp"); // Redirect to home page.
} else {
    request.setAttribute("message", "Unknown username/password, try again"); // This sets the ${message}
    request.getRequestDispatcher("login.jsp").forward(request, response); // Redisplay JSP.
}
Run Code Online (Sandbox Code Playgroud)

并添加${message}到您的JSP:

<form action="LoginPage" method="POST">
    User name: <input type="text" name="userName" size="20"><br>
    Password: <input type="password" name="password" size="20">
    <br><br>
    <input type="submit" value="Submit"> ${message}
</form>
Run Code Online (Sandbox Code Playgroud)

以下是一些了解如何正确执行JSP/Servlet/JDBC的链接.