Генерация HttpRequest из определенного IP-адреса в Java

Я использую Apache HttpClient для создания почтового запроса и отправки данных. Поскольку удаленное приложение передает IP-адрес пользователя, отправляющего данные, я хочу отправить почтовый запрос для указанного пользователем IP-адреса.

Как мне это настроить?

public static void loginUser(String username, String password, String ip) throws Exception{
      try {
            HttpClient client = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://login.myapp.com/");

            // Request parameters and other properties.
            List<NameValuePair> params = new ArrayList<NameValuePair>(2);
            params.add(new BasicNameValuePair("username",username));
            params.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            // Execute and get the response.
            HttpResponse response = client.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                //etc....
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

РЕДАКТИРОВАТЬ: Чтобы избежать путаницы,

Я хочу включить собственный IP-адрес в заголовки httprequest, чтобы конечное приложение знало, что этот запрос [из моего приложения] пришел с пользовательского IP-адреса, но не с IP-адреса, на котором запущено мое приложение.

Допустим, мое приложение работает на сервере с IP-адресом 1.1.1.0. Теперь мой пользователь выполняет метод loginUser с тестом, тестом, 199.199.199.0. Теперь HTTP-запрос от приложения к целевому URL-адресу должен быть отправлен с адреса 199.199.199.0.


person Reddy    schedule 16.08.2013    source источник
comment
Вы хотите получить ip клиента?   -  person smk    schedule 16.08.2013
comment
Пожалуйста, уточните, что вы пытаетесь сделать.   -  person Jason C    schedule 16.08.2013
comment
@JasonC Я хочу включить собственный IP-адрес в заголовки httprequest, чтобы конечное приложение знало, что этот запрос [из моего приложения] пришел с пользовательского IP-адреса, но не с IP-адреса, на котором запущено мое приложение.   -  person Reddy    schedule 16.08.2013
comment
Я обновил свой ответ. Просто из любопытства, почему вы пытаетесь это сделать? Какую службу вы пытаетесь предоставить, какова ее цель и в какую службу вы пытаетесь войти?   -  person Jason C    schedule 16.08.2013
comment
Мы входим в нашу внутреннюю сеть Juniper SRX. Он не предоставляет никакого API для входа в систему, поэтому мы должны использовать его собственный веб-интерфейс для входа в систему. Это приложение предназначено для внутренней интеграции с другими службами входа в систему.   -  person Reddy    schedule 16.08.2013
comment
Одним из возможных решений, в зависимости от ваших требований к безопасности, является настройка VPN-доступа для ваших пользователей, чтобы пользователи сначала устанавливали VPN-подключение, а затем запускали ваше веб-приложение на внутреннем сервере. Вы также можете подключить свой веб-сервер к вашей сети через VPN и получить доступ к своим внутренним службам входа в систему напрямую через ссылку VPN, при этом сам веб-сервер будет обслуживать клиентов по ссылке WAN.   -  person Jason C    schedule 16.08.2013


Ответы (3)


ОП пишет:

Я хочу включить собственный IP-адрес в заголовки httprequest, чтобы конечное приложение знало, что этот запрос [из моего приложения] пришел с пользовательского IP-адреса, но не с IP-адреса, на котором запущено мое приложение
...
Допустим, я открыл google.co.in, теперь сервер Google знает, что этот запрос пришел с моего IP-адреса. теперь, если я использую HttpClient в apache, как мне настроить этот IP-адрес, чтобы при чтении сервера Google он обрабатывал этот запрос, исходно полученный с этого IP-адреса

Вы не можете.

(На самом деле это 4-я интерпретация, которую я написал в своем исходном ответе ниже.)

IP-адрес отправителя не отправляется в виде заголовка HTTP. Он отправляется в поле заголовка IP-протокола. Сервер получает IP-адрес отправителя снизу на уровне сокета, а не из информации HTTP.

И нет, вы не сможете подделать свой IP (это называется «спуфинг»), даже если захотите. Java не имеет встроенной поддержки необработанных сокетов, вы не можете изменить информацию на уровне IP. Даже если бы вы могли (или вы используете JNI или какое-либо приложение или оборудование для фильтрации исходящих пакетов), природа TCP делает спуфинг IP бесполезным для вашей ситуации (ответы будут отправлены на поддельный IP, а также многие другие трудности, которые выходят далеко за рамки объем этого ответа).

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

Изменить: другие варианты

Я упомянул об этом в комментариях к вопросу, но я также включаю их в свой ответ для полноты картины:

Одним из возможных решений, в зависимости от ваших требований к безопасности, является настройка VPN-доступа для ваших пользователей, чтобы пользователи сначала устанавливали VPN-подключение, а затем запускали ваше веб-приложение на внутреннем сервере.

Вы также можете подключить свой веб-сервер к своей сети через VPN и получить доступ к своим внутренним службам входа напрямую через ссылку VPN, а веб-приложение будет работать по ссылке WAN.


Это был мой первоначальный ответ до того, как ОП разъяснил требования:

Не совсем понятно, о чем вы спрашиваете, поэтому я отвечу на возможные варианты, о которых я могу подумать.

Если вы имеете в виду, что хотите, чтобы пользователь мог указать IP-адрес сервера, на который вы отправляете сообщение, просто создайте URL-адрес из IP-адреса:

HttpPost httppost = new HttpPost("http://" + ip + "/");

Если вы имеете в виду, что хотите, чтобы сервер делал что-то на основе IP-адреса пользователя: IP-адрес пользователя будет доступен на стороне сервера, когда сервер получит запрос, вам не нужно отправлять его явно. Как именно получить доступ к этой информации на стороне сервера, зависит от используемого вами сервера.

Если вы имеете в виду, что хотите, чтобы пользователь мог указать IP-адрес, который отправляется на сервер, просто отправьте его, как вы отправляете другие параметры:

params.add(new BasicNameValuePair("whatever", ip));

Если вы имеете в виду, что вы входите в систему, которая зависит от IP-адреса пользователя, с вашего сервера от имени удаленного пользователя, и вы хотите притвориться этим удаленным пользователем, чтобы войти удается: вы не можете. Система, в которую вы пытаетесь войти, имеет меры безопасности, чтобы предотвратить именно то, что вы пытаетесь сделать. Возможно, владельцы этой системы могут сделать исключение для IP-адреса вашего сервера; вы должны спросить их.

person Jason C    schedule 16.08.2013
comment
Извините за не достаточно ясно. Допустим, я открыл google.co.in, теперь сервер Google знает, что этот запрос пришел с моего IP-адреса. теперь, если я использую HttpClient в apache, как мне настроить этот IP-адрес, чтобы при чтении сервера Google он обрабатывал этот запрос, первоначально полученный с этого IP-адреса - person Reddy; 16.08.2013

Это просто невозможно из-за того, как работает TCP. Речь идет о сети. Неважно, какие инструменты или языки программирования вы используете.
Пытаясь замаскироваться под другой IP-адрес, TCP не может ни завершить рукопожатие, ни отправить ваши данные. С UDP вы можете проделать этот трюк, но HTTP (веб-протокол) основан на TCP, поэтому в этом нет смысла.

Некоторые ссылки для дальнейшего чтения:
подтверждение TCP
Детали TCP
данные UDP

person zmirc    schedule 16.08.2013