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

标签 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> 

我在 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();

而且我不知道如何让它发挥作用。 有什么适合我的快速修复方法吗?

这不是一个大项目,我只是想要一个获取用户名和密码的登录页面 然后 servlet 将在数据库中搜索用户名,然后检查密码。 我已经按照你们所说的进行了更改。 但是输出看起来像 在 try block 中出错,因为,我得到了登录不成功页面。 我将代码“Login not successful Page”放在 Catch block 中。

最佳答案

不清楚您所说的“如何让它发挥作用”是什么意思。会发生什么?不会发生什么?至少我可以在您的代码中发现几个问题:

  1. 您在 servlet 中发出 HTML。您应该为此使用 JSP。
  2. 您正在泄漏 JDBC 资源。您需要在 finally 中关闭它们。
  3. 您没有在 SQL 字符串中设置输入的 用户名(和密码)。
  4. 您没有让数据库执行比较密码的任务。将其添加到 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.
}

并将 ${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>

这里有一些链接可以学习如何正确地执行 JSP/Servlet/JDBC。

关于java - 我想使用 servlet 创建一个登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3423306/

相关文章:

php - 学说的createQuery中的子查询

mySQL 存储过程 : input paramrter passed to the show procedure

JavaScript : how to use delegate on each dynamically added div

java - Outlook 日历与 Java Web 服务的连接

jsp - 当 jar 中指定类路径时,嵌入式 Jetty 无法加载 JSP 标记库

java - 以交互方式从 java 代码调用 perl 脚本

java - 登录后重定向到所需位置

java - 在可拖动的 jPanel 中更改 jLabel 的文本

java - 使用 wifi 发现移动设备

mysql - JOIN 三个表,即使一个是空的