Я хочу создать страницу входа с помощью сервлетов - PullRequest
1 голос
/ 06 августа 2010

Я хочу создать страницу входа, используя 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();

И я не знаю, как заставить это работать. Любое быстрое исправление доступно для меня?

Это не большой проект, я просто хочу страницу входа, которая получает имя пользователя и пароль Затем сервлет будет искать имя пользователя в БД, а затем проверяет пароль. Я внес изменения, которые вы, ребята, сказали. Но вывод выглядит как-то неправильно в блоке try, потому что я получаю страницу неудачного входа. Я поместил код "Страница не успешна" в блоке Catch.

Ответы [ 4 ]

6 голосов
/ 06 августа 2010

Непонятно, что вы имеете в виду под «Как заставить это работать».Что просходит?Что не происходит?По крайней мере, я могу обнаружить несколько проблем в вашем коде:

  1. Вы излучаете 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.

1 голос
/ 15 января 2011

вы должны использовать SELECT PASSWORD from Login в запросе sql здесь PASSWORD - это имя столбца, который содержит пароль в вашей таблице базы данных LOGIN

1 голос
/ 06 августа 2010

toString () для request.getParameter не требуется.

Вы можете изменить свой запрос на

String sql = "SELECT <PASSWORD_CLM> FROM LOGIN WHERE USR_NAME="+userName;


while(rs.next()) 
{ 
   //read the password in pass. 
} 
if(pass !=null && pass.equals(passWord)) 
{ 
  // Code
}
0 голосов
/ 06 августа 2010

Я вижу проблемы со строками:

  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;

Должно быть:

String sql = "SELECT * from LOGIN WHERE USR_NAME="+ userName+";";

Также проверьте имя таблицы для информации для входа в систему, поскольку у вас есть это как LOGIN уверен, что это не login? Также я хотел бы избежать написания HTML в сервлете и просто переслать его в другой JSP. Это может быть что-то простое сейчас. Говоря вошли в систему. Декан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...