написан сайт на JSP, множество функций которого зависит от данных, получаемых с request.getRemoteAddr();
структура сервера такова динамика Tomcat:8080, статика nginx:80 (все запросы идут через nginx)
в конфижке nginx есть строки для рут / директории:
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
соединение проходит, все работает отлично, но параметр из функции "request.getRemoteAddr();" имеет значение localhost (хотя отправка заголовков включена).
Вопрос: для Апача есть "mod_rpaf", если ли аналогичное решение для Томката (как никак одна "песочница")? Дабы JSP'шки в Томкате корректно видели реальный ип адресс клиента (через nginx).
Здравствуйте, 31337, Вы писали:
3>написан сайт на JSP, множество функций которого зависит от данных, получаемых с request.getRemoteAddr(); 3>структура сервера такова динамика Tomcat:8080, статика nginx:80 (все запросы идут через nginx)
3>в конфижке nginx есть строки для рут / директории: 3>proxy_pass http://127.0.0.1:8080; 3>proxy_set_header Host $host; 3>proxy_set_header X-Real-IP $remote_addr; 3>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
3>соединение проходит, все работает отлично, но параметр из функции "request.getRemoteAddr();" имеет значение localhost (хотя отправка заголовков включена). 3>Вопрос: для Апача есть "mod_rpaf", если ли аналогичное решение для Томката (как никак одна "песочница")? Дабы JSP'шки в Томкате корректно видели реальный ип адресс клиента (через nginx).
как вариант — использовать request.getHeader("X-Real-IP")
Здравствуйте, 31337, Вы писали:
3>соединение проходит, все работает отлично, но параметр из функции "request.getRemoteAddr();" имеет значение localhost (хотя отправка заголовков включена). 3>Вопрос: для Апача есть "mod_rpaf", если ли аналогичное решение для Томката (как никак одна "песочница")? Дабы JSP'шки в Томкате корректно видели реальный ип адресс клиента (через nginx).
Есть возможность сделать все централизовано через сервлет-фильтр
final String realIp = request.getHeader(X_FORWARDED_FOR);
if (realIp != null) {
filterChain.doFilter(
new HttpServletRequestWrapper(request) {
public String getRemoteAddr() {
return realIp;
}
public String getRemoteHost() {
return realIp;
}
},
response
);
}
mazurkin wrote:
> 3>соединение проходит, все работает отлично, но параметр из функции "request.getRemoteAddr();" имеет значение localhost (хотя отправка заголовков включена). > 3>Вопрос: для Апача есть "mod_rpaf", если ли аналогичное решение для Томката (как никак одна "песочница")? Дабы JSP'шки в Томкате корректно видели реальный ип адресс клиента (через nginx).
Пардон, посмотрел на свой пост и подумал, что сократил лишнего и могу
ввести в заблуждение — вот весь вариант, если вы используете Spring.
Если не используете — подправите пару строчек.
public class ForwardingFilter extends OncePerRequestFilter {
private static final String X_FORWARDED_FOR = "x-forwarded-for";
private boolean enabled;
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) throws
ServletException, IOException {
if (enabled) {
final String realIp = request.getHeader(X_FORWARDED_FOR);
if (realIp != null) {
filterChain.doFilter(
new HttpServletRequestWrapper(request) {
public String getRemoteAddr() {
return realIp;
}
public String getRemoteHost() {
return realIp;
}
},
response
);
return;
}
}
filterChain.doFilter(request, response);
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
Здравствуйте, mazurkin, Вы писали:
M>mazurkin wrote:
>> 3>соединение проходит, все работает отлично, но параметр из функции "request.getRemoteAddr();" имеет значение localhost (хотя отправка заголовков включена). >> 3>Вопрос: для Апача есть "mod_rpaf", если ли аналогичное решение для Томката (как никак одна "песочница")? Дабы JSP'шки в Томкате корректно видели реальный ип адресс клиента (через nginx).
M>Пардон, посмотрел на свой пост и подумал, что сократил лишнего и могу M>ввести в заблуждение — вот весь вариант, если вы используете Spring.
M>Если не используете — подправите пару строчек.
Spring не использую. Исправил первую строчку на:
public class ForwardingFilter implements Filter {
enable отключил. Фильтр срабатывает, но в логах IP адрес nginx. getRemoteAddr() также возвращает не тот адрес.
khap wrote:
> Spring не использую. Исправил первую строчку на: >
> public class ForwardingFilter implements Filter {
>
> > enable отключил. Фильтр срабатывает, но в логах IP адрес nginx. getRemoteAddr() также возвращает не тот адрес. > > Что-то еще нужно добавить?
Вам нужно почитать доку по nginx — он должен подставлять реальный адрес
клиента в специальное поле в транслируемом запросе. Насколько я помню,
там даже имя этого поля можно установить.
Далее поставьте точку останова на фильтре — в аттрибутах входящего
запроса должно быть это значение.
Здравствуйте, mazurkin, Вы писали:
M>Вам нужно почитать доку по nginx — он должен подставлять реальный адрес M>клиента в специальное поле в транслируемом запросе. Насколько я помню, M>там даже имя этого поля можно установить.
M>Далее поставьте точку останова на фильтре — в аттрибутах входящего M>запроса должно быть это значение.
Это все работает. И nginx все подставляет, и апач нормально работает, и фильтр срабатывает, по крайней мере выделяет реальный IP. А вот в дальнейшем вызывается не HttpServletRequestWrapper.getRemoteAddr(), а чья-то другая.