Я бы предпочел первое выше второго решения. Это запрос информации области и на самом деле не принадлежит сеансу, это приведет только к "wtf?" опыта, когда у вас есть несколько окон / вкладок, открытых в одном сеансе.
По ссылке на страницу входа просто передайте текущий URL в качестве параметра запроса:
<a href="/login?from=${pageContext.request.requestURI}">Login</a>
Или, если это форма POST на странице входа в систему:
<input type="hidden" name="from" value="${pageContext.request.requestURI}">
В форме входа перенесите его в следующий запрос как скрытую переменную:
<input type="hidden" name="from" value="${param.from}">
В сервлете входа используйте его:
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getParameter("from"));
} else {
// Show error.
}
Довольно просто, не правда ли? :)
Некоторые могут предложить использовать request.getHeader("referer")
для этого в форме входа вместо request.getRequestURI()
в ссылке / кнопке перед входом в систему, но я бы не стал этого делать, поскольку это контролируется клиентом и не всегда возвращает надежное Информация. Некоторые клиенты отключили его или используют какое-либо программное обеспечение, которое подделывает его с недопустимым значением, как, например, большинство ( кашель ) продуктов Symantec.