Вы можете связать сеанс IP-адрес с помощью настраиваемого фильтра:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
boolean chainCompleted = implementEnforcement(request, response);
if (!chainCompleted) {
filterChain.doFilter(request, response);
}
}
private boolean implementEnforcement(HttpServletRequest request, HttpServletResponse response) throws IOException {
final String key = "enforcement.ip";
HttpSession session = request.getSession(false);
if (session != null) {
// we have a session
String ip = request.getRemoteAddr();
String ipInSession = session.getAttribute(key);
if (ipInSession == null) {
session.setAttribute(key, ip);
} else {
if (!ipInSession.equals(ip)) {
// JSESSIONID is the same, but IP has changed
// invalidate the session because there is a probability that it is
// a session hijack
session.invalidate();
return true;
}
}
}
return false;
}
запоминает IP-адрес пользователя а затем сравнивает текущий IP-адрес с запоминаемым: если он отличается, сеанс уничтожается.
Стоит помнить, что один и тот же клиент может быть видимым на нескольких IP-адресах законно (например, за прокси-серверами балансировки нагрузки) –
Да, это обсуждение было сделано, и мы знаем о потенциальной проблеме. – OddBeck
Просто сохраните удаленный адрес в сеансе после входа и проверьте его. – Bart