#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:
-
ВАШ КОД ЯВЛЯЕТСЯ УТЕЧКОЙ БЕЗОПАСНОСТИ. Представьте, что я ввожу веб-форму в поле pass:
whatever' OR TRUE;--
Я бы вошел в систему (просто поместите эту строку в свой запрос и распечатайте ее обратно, посмотрите, что это будет делать…
Вам нужно использовать PreparedStatement
, заменить все переменные вопросительными знаками.
- В ВАШЕМ КОДЕ ПРОИЗОШЛА УТЕЧКА ПАМЯТИ. Подключение, инструкция и результирующие наборы — это все ресурсы; они нуждаются в явном закрытии. Погуглите, как использовать ‘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);
}