JSP проверяет пользователя с предыдущей страницы
В моем веб-приложении JSP я хочу проверить, что пользователь пришел с определенной моей страницы, http://myapplication.com/foo.jsp
, На странице проверки я мог сделать:
String ref = request.getHeader("referer");
Тогда сравните ref
в http://myapplication.com/foo.jsp
Тем не менее, эта проверка может быть легко подделана. Какие еще методы используются для проверки того, что клиент приходит с ожидаемого URL?
Я полагаю, что это уже было в SO. Спасибо
PR
2 ответа
Пусть сервлет предварительной обработки первого JSP сгенерирует уникальный токен.
String token = UUID.randomUUID().toString();
Сохраните это в сессии
session.setAttribute("token", token);
Передайте это как скрытое значение ввода формы
<input type="hidden" name="token" value="${token}" />
или как параметр запроса ссылки, когда вы используете ссылки вместо форм
<a href="second.jsp?token=${token}">link</a>
Позвольте сервлету предварительной обработки второго JSP сравнить его с тем, что в сеансе
String token = (String) session.getAttribute("token");
session.removeAttribute("token");
if (token != null && token.equals(request.getParameter("token"))) {
// Valid, continue requesst.
} else {
// Invalid, block request.
}
Это была базовая концепция, предполагающая единый постраничный разговор. Чтобы охватить несколько страниц / вкладок браузера, которые вы хотите использовать Set<String>
или, может быть Map<String, Set<String>>
вместо этого как токен (с URI в качестве ключей и токенов в качестве значений).
Единственный способ убедиться в этом - сохранить "последнюю посещенную страницу" в сеансе. Таким образом, он не будет передан клиенту или, возможно, подделан заголовком запроса.
Идея состоит в том, что в возвращаемом jsp он обновляет свойство "последняя посещенная страница" в текущем сеансе. Затем при ранней обработке страницы выполняется проверка свойства "последняя посещенная страница".
Конечно, это не работает между веб-серверами, если они не настроены для обмена информацией о сеансе.