String sql = "select * from reg, где username = '" + user + "' и pass = '" + pwd + "'";
Это крайне плохая практика. Этот подход требует, чтобы как имя пользователя, так и пароль передавались по простой ванили через запросы. Более того, у вас есть дыра для атаки SQL-инъекцией.
Используйте сеансы, в JSP / Servlet у вас есть HttpSession
для. На самом деле также нет необходимости снова и снова нажимать на БД при каждом запросе, используя Filter
. Это излишне дорого. Просто введите User
в сеанс, используя Servlet
и используйте Filter
для проверки его присутствия при каждом запросе.
Начните с /login.jsp
:
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit"> ${error}
</form>
Затем создайте LoginServlet
, который сопоставлен с url-pattern
из /login
и имеет doPost()
, реализованный следующим образом:
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Put user in session.
response.sendRedirect("/secured/home.jsp"); // Go to some start page.
} else {
request.setAttribute("error", "Unknown login, try again"); // Set error msg for ${error}
request.getRequestDispatcher("/login.jsp").forward(request, response); // Go back to login page.
}
Затем создайте LoginFilter
, который сопоставляется с url-pattern
из /secured/*
(однако вы можете выбрать свой собственный, например, /protected/*
, /restricted/*
, /users/*
и т. Д., Но это должно как минимум охватывать все защищенные страницы, вам также нужно поместить JSP в соответствующую папку в WebContent), и doFilter()
реализован следующим образом:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
String loginURI = request.getContextPath() + "/login.jsp";
boolean loggedIn = session != null && session.getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response); // User is logged in, just continue request.
} else {
response.sendRedirect(loginURI); // Not logged in, show login page.
}
Так и должно быть. Надеюсь это поможет.
Чтобы понять, как будет выглядеть UserDAO
, вам может пригодиться эта статья . В нем также рассказывается, как использовать PreparedStatement
для защиты вашего веб-приложения от атак SQL-инъекций.
Смотри также: