JSP+Tomcat+nginx
От: 31337 Беларусь  
Дата: 15.05.09 20:08
Оценка:
написан сайт на 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).
by SL@t <iCq:_143003561>
java nginx tomcat apache mod_rpaf jsp servlets
Re: JSP+Tomcat+nginx
От: Ildar Karimov Россия  
Дата: 16.05.09 21:47
Оценка:
Здравствуйте, 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")
Re: JSP+Tomcat+nginx
От: mazurkin http://mazurkin.info
Дата: 25.05.09 12:19
Оценка:
Здравствуйте, 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
  );
}
Re[2]: JSP+Tomcat+nginx
От: mazurkin http://mazurkin.info
Дата: 25.05.09 12:23
Оценка:
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;
    }
}
Posted via RSDN NNTP Server 2.1 beta
Re[3]: JSP+Tomcat+nginx
От: khap Россия https://khorost.net
Дата: 14.09.09 16:03
Оценка:
Здравствуйте, 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() также возвращает не тот адрес.

Что-то еще нужно добавить?
Re[4]: JSP+Tomcat+nginx
От: mazurkin http://mazurkin.info
Дата: 14.09.09 18:16
Оценка:
khap wrote:

> Spring не использую. Исправил первую строчку на:

>
> public class ForwardingFilter implements Filter {
>

>
> enable отключил. Фильтр срабатывает, но в логах IP адрес nginx. getRemoteAddr() также возвращает не тот адрес.
>
> Что-то еще нужно добавить?

Вам нужно почитать доку по nginx — он должен подставлять реальный адрес
клиента в специальное поле в транслируемом запросе. Насколько я помню,
там даже имя этого поля можно установить.

Далее поставьте точку останова на фильтре — в аттрибутах входящего
запроса должно быть это значение.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: JSP+Tomcat+nginx
От: khap Россия https://khorost.net
Дата: 15.09.09 09:12
Оценка:
Здравствуйте, mazurkin, Вы писали:

M>Вам нужно почитать доку по nginx — он должен подставлять реальный адрес

M>клиента в специальное поле в транслируемом запросе. Насколько я помню,
M>там даже имя этого поля можно установить.

M>Далее поставьте точку останова на фильтре — в аттрибутах входящего

M>запроса должно быть это значение.

Это все работает. И nginx все подставляет, и апач нормально работает, и фильтр срабатывает, по крайней мере выделяет реальный IP. А вот в дальнейшем вызывается не HttpServletRequestWrapper.getRemoteAddr(), а чья-то другая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.