Я написал фильтр для перехвата запроса сервлета и проверки, требуется ли для входа пользователя URL.
Кажется, это звучит неправильно. Вы должны скорее сопоставить Filter
с тем же url-pattern
из Servlet
, а еще лучше с servlet-name
из Servlet
. Таким образом, Filter
вызывается только , когда вызывается Servlet
.
Возвращаясь к вашей актуальной проблеме: когда пользователь не вошел в систему, у вас есть два варианта:
Сохранить URL-адрес в сеансе:
if (session.getAttribute("user") == null) {
session.setAttribute("back", httpRequest.getRequestURI());
httpRequest.sendRedirect("login");
} else {
chain.doFilter(request, response);
}
который вы используете при входе в систему:
User user = userDAO.find(username, password);
if (user != null) {
session.setAttribute("user", user);
String back = (String) session.getAttribute("back");
if (back != null) {
session.removeAttribute("back");
response.sendRedirect(back);
} else {
response.sendRedirect("home"); // Home page?
}
} else {
// Show error?
request.setAttribute("message", "Unknown user, please retry");
request.getRequestDispatcher("login").forward(request, response);
}
Передать URL как параметр запроса:
if (session.getAttribute("user") == null) {
httpRequest.sendRedirect("login?back=" + httpRequest.getRequestURI());
} else {
chain.doFilter(request, response);
}
, через который вы переходите к последующему запросу в качестве скрытого поля ввода:
<input type="hidden" name="back" value="${param.back}">
который вы используете при входе в систему:
User user = userDAO.find(username, password);
if (user != null) {
session.setAttribute("user", user);
String back = request.getParameter("back");
if (back != null) {
response.sendRedirect(back);
} else {
response.sendRedirect("home"); // Home page?
}
} else {
// Show error?
request.setAttribute("message", "Unknown user, please retry");
request.getRequestDispatcher("login").forward(request, response);
}
Кодировка URL, как некоторые предполагают, не требуется, поскольку getRequestURI()
не будет декодироваться.