Как перенаправить пользователя на другую страницу JSP в случае неверных учетных данных

#java #servlets #error-handling

#java #сервлеты #обработка ошибок

Вопрос:

Я создаю форму входа для веб-приложения java. У меня пользователь входит в систему с правильным паролем через java-сервлет, но я хочу перенаправить пользователя на другую страницу JSP, если он введет неправильный пароль. Моя первая идея — создать инструкцию try / catch. Однако при попытке этого я получаю пустые страницы. Как я могу гарантировать, что пользователь узнает, когда он ввел неправильный пароль? Спасибо

 public class Loginn extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        String name = request.getParameter("name");
        String pass = request.getParameter("pass");
        MyDb1 db = new MyDb1();
      Connection con = db.getCon();
      Statement stmt = con.createStatement();
     ResultSet rs = stmt.executeQuery("select uid,name,pass from register where email = '" name "' and  pass = '" pass "'");

     while ((rs.next())) {

        String uid = rs.getString("uid");

          HttpSession session=request.getSession();  
          session.setAttribute("name",uid);
          response.sendRedirect("http://localhost:8080/Final_Year_Project_5_/userprofile.jsp");  

} 


} catch (SQLException ex) {
        Logger.getLogger(Loginn.class.getName()).log(Level.SEVERE, null, ex);

    }
  

}

Ответ №1:

  1. ВАШ КОД ЯВЛЯЕТСЯ УТЕЧКОЙ БЕЗОПАСНОСТИ. Представьте, что я ввожу веб-форму в поле pass:

     whatever' OR TRUE;--
      

Я бы вошел в систему (просто поместите эту строку в свой запрос и распечатайте ее обратно, посмотрите, что это будет делать…

Вам нужно использовать PreparedStatement , заменить все переменные вопросительными знаками.

  1. В ВАШЕМ КОДЕ ПРОИЗОШЛА УТЕЧКА ПАМЯТИ. Подключение, инструкция и результирующие наборы — это все ресурсы; они нуждаются в явном закрытии. Погуглите, как использовать ‘try-with-resources’ в java.

JSP — устаревшая технология, и ваша обработка исключений оставляет соединение плавающим. Я предлагаю сделать: throw new ServletException(ex) вместо этого, по крайней мере, тогда вы выполняете обработку ошибок в нужном месте (контейнер сервлета).

Пустые страницы, вероятно, связаны с тем, как вы обрабатываете исключения (вы регистрируете их, а затем ничего не делаете, в результате чего получается пустая страница). Исправьте это, и теперь у вас есть реальная ошибка, на которую вы можете посмотреть.

Ответ №2:

Попробуйте использовать if и else ,

 public class Loginn extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            String name = request.getParameter("name");
            String pass = request.getParameter("pass");
            MyDb1 db = new MyDb1();
            Connection con = db.getCon();

            PreparedStatement ps = c.prepareStatement("select uid,name,pass from register where email = ? and  pass = ?");
            ps.setString(1, un);
            ps.setString(2, pw);

            ResultSet rs = ps.executeQuery();

            if (rs.next()) {

              String uid = rs.getString("uid");

              HttpSession session=request.getSession();  
              session.setAttribute("name", uid);


              response.sendRedirect("userprofile.jsp");  // No need to add whole URL unless this is in another Folder.
            } else {
              response.sendRedirect("error.jsp");
            }

    } catch (SQLException ex) {
            Logger.getLogger(Loginn.class.getName()).log(Level.SEVERE, null, ex);
    }