Как установить IP-адрес источника для HTTP-запроса?
Мне нужно установить исходный IP-адрес (для чего-то вроде IP Spoofing) перед отправкой HTTP-запроса. Класс, используемый для настройки http-соединения, - HTTPURLConnection
. Я нашел ниже ссылку на stackoverflow, которая действительно полезна.
Регистрация и использование настраиваемого протокола java.net.URL
Как и в сообщении, я уже создал 3 класса, расширяя URLConnection
, URLStreamHandler
и реализуя URLStreamHandlerFactory
. Это выглядит нормально; однако я получаю исключение, которое, по моему мнению, связано с тем, что я не реализовал getInputStream
для URLConnection
, как было упомянуто выше.
У меня есть пара вопросов
1 > Я расширяю пользовательский класс URLConnection
из HTTPURLConnection
, так что необходимость реализации getInputStream
, так или иначе, это виртуальный метод
2 > Если мне это нужно, может ли кто-то предоставить примерную реализацию этого метода?
Ответы
Ответ 1
JMeter уже предоставляет функцию IP Spoofing.
В запросах по умолчанию Http выберите вкладку расширенной вкладки (в версии 3.0 JMeter):
См. http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request_parms1:
Исходное поле адреса [Только для HTTP-запроса с реализацией HTTPClient] Это свойство используется для включения IP Spoofing. Он переопределяет локальный IP-адрес по умолчанию для этого образца. Хост JMeter должен иметь несколько IP-адресов (например, IP-алиасы, сетевые интерфейсы, устройства). Значение может быть именем хоста, IP-адресом или устройством сетевого интерфейса, таким как "eth0" или "lo" или "wlan0". Если определено свойство httpclient.localaddress, которое используется для всех запросов HttpClient.
Ответ 2
Чтобы выполнить другой адрес источника с помощью HTTP-запроса, вы можете использовать локальный прокси.
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
public class Huhu {
public static void main(String[] args) throws IOException {
URL url = new URL("http://google.com");
Proxy proxy = new Proxy(Proxy.Type.DIRECT,
new InetSocketAddress(
InetAddress.getByAddress(
new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);
}
}
Вам не нужно что-то переопределять.
Ответ 3
На основе ответа UBIK LOAD PACK. Вот такой же код, используя Aapche http client 3.x. (Переменная для установки IP-адреса источника args[1]
)
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.protocol.Protocol;
public class HC3Test {
public static void main(String[] args) throws Exception {
String url = args[0];
java.net.URL uri = new java.net.URL(url);
HostConfiguration hc = new HostConfiguration();
hc.setHost(uri.getHost(), uri.getPort(), Protocol.getProtocol(uri.getProtocol()));
hc.setLocalAddress(java.net.InetAddress.getByName(args[1]));//for pseudo 'ip spoofing'
HttpClient client = new HttpClient(new SimpleHttpConnectionManager());
client.setHostConfiguration(hc);
GetMethod method = new GetMethod(url);
client.executeMethod(method);
method.releaseConnection();
}
}
Пример кода для http client 4.x:
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;
public class HC4Test {
public static void main(String[] args) throws Exception {
DefaultHttpClient httpClient = new DefaultHttpClient();
org.apache.http.params.HttpParams params = httpClient.getParams();
params.setParameter(ConnRoutePNames.LOCAL_ADDRESS,
java.net.InetAddress.getByName(args[1]));//for pseudo 'ip spoofing'
httpClient.execute(new HttpGet(args[0]));
}
}