Для решения своей задачи как-раз делал костыль с определением IP-адреса клиента. Единственное отличие - передавал адрес не в дин. код, а в xsl в личный кабинет. Далее краткое описание решения.
1. В файле web.xml добавляем новый фильтр, например, RemoteHostFilter.
2. Фильтр RemoteHostFilter имеет примерно следующее содержимое:
Код:
/**
* <p><b>Сохранение удалённого хоста в кеше</b></p>
* <p>Получает удалённый хост клиента из запроса и сохраняет в локальную переменную потока
* для будущего использования.</p>
*/
public class RemoteHostFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
RequestDataHolder.setHost(request.getHeader("host"));
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
3. Кеш RequestDataHolder имеет примерно следующее содержимое:
Код:
/**
* <p><b>Сохранение данных запроса локально в каждом потоке</b></p>
*/
public class RequestDataHolder {
private static final ThreadLocal<String> hostHolder = new ThreadLocal<String>();
public final static String getHost() {
return hostHolder.get();
}
public final static void setHost(String host) {
hostHolder.set(host);
}
}
4. В любом скрипте, который обрабатывает запросы пользователей, вызвать getHost для получения адреса клиента.
Идея в том, что для каждого запроса пользователя создаётся свой поток и мы можем сохранить адрес в переменной потока.
Для обработки асинхронных событий такой метод использовать напрямую нельзя, для синхронных, наверное, тоже, т. к. они обрабатываются в других потоках.