Java получить ip адрес клиента

Как получить Ip-адрес клиента на Java

В Java вы можете использовать HttpServletRequest.getremoteaddr() для получения IP-адреса клиента, который обращается к вашему веб-приложению Java.

import javax.servlet.http.HttpServletRequest; String ipAddress = request.getRemoteAddr();

1. Прокси-сервер или Cloudflare

Для веб-приложения, которое находится за прокси-сервером, балансировщиком нагрузки или популярным решением Cloudflare , вы должны получить IP-адрес клиента через заголовок HTTP-запроса X-Forwarded-For (XFF) .

import javax.servlet.http.HttpServletRequest; //. private static String getClientIp(HttpServletRequest request) < String remoteAddr = ""; if (request != null) < remoteAddr = request.getHeader("X-FORWARDED-FOR"); if (remoteAddr == null || "".equals(remoteAddr)) < remoteAddr = request.getRemoteAddr(); >> return remoteAddr; >

2. Все еще не работаешь?

Просмотрите заголовок HTTP-запроса клиента и попытайтесь определить, где хранится IP-адрес.

private Map getRequestHeadersInMap(HttpServletRequest request) < Mapresult = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) < String key = (String) headerNames.nextElement(); String value = request.getHeader(key); result.put(key, value); >return result; > 

Примеры заголовков запросов для веб-приложения за Cloudflare.

"referer" :"https://www.google.com/", "cf-ipcountry" :"US", "cf-ray" :"348c7acba8a02210-EWR", "x-forwarded-proto" :"https", "accept-language" :"en-US,en;q=0.8", "cookie" :"__cfduid=d3c6e5d73aa55b6b42fad9600c94849851490726068; _ga=GA1.2.450731937.1490726069", "x-forwarded-for" :"100.8.204.40", // ", "host" :"127.0.0.1:8080", "upgrade-insecure-requests" :"1", "connection" :"close", "cf-connecting-ip" :"100.8.204.40", "accept-encoding" :"gzip", "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

Рекомендации

Источник

Читайте также:  Python telegram bot mail

Найдите IP-адрес клиента, подключенного к серверу

В этом кратком руководстве мы узнаем, как найти IP-адрес клиентского компьютера, подключенного к серверу.

Мы создадим простой клиент-серверный сценарий, который позволит нам исследовать API-интерфейсы java.net , доступные для связи TCP/IP.

2. Фон​

Приложения Java используют сокеты для связи и отправки данных через Интернет . Java предоставляет класс java.net.Socket для клиентских приложений.

Класс java.net.ServerSocket используется для реализации сокетов на стороне сервера на основе TCP /IP. Однако давайте сосредоточимся только на приложениях TCP/IP.

3. Пример использования​

Предположим, что у нас есть сервер приложений, работающий в нашей системе. Этот сервер отправляет приветственные сообщения клиентам. В этом случае сервер использует для связи TCP-сокет.

Сервер приложений привязан к определенному порту TCP. Его адрес сокета представляет собой комбинацию этого порта и IP-адреса интерфейса локальной сети . По этой причине клиент должен использовать этот конкретный адрес сокета для подключения к серверу.

4. Образец заявления​

Теперь, когда мы определили наш вариант использования, давайте начнем с создания сервера.

4.1. Сервер приложений​

Во-первых, нам нужно создать экземпляр ServerSocket для прослушивания входящих запросов на подключение. Конструктор класса ServerSocket требует номер порта в качестве аргумента:

 public class ApplicationServer     private ServerSocket serverSocket;   private Socket connectedSocket;    public void startServer(int port) throws IOException    serverSocket = new ServerSocket(port);   connectedSocket = serverSocket.accept();   //.  

4.2. Получение IP-адреса клиента​

Теперь, когда мы установили наш сокет для входящего клиента, давайте посмотрим, как получить IP-адрес клиента. Экземпляр Socket содержит адрес сокета удаленного клиента. Мы можем использовать метод getRemoteSocketAddress , чтобы проверить это.

Метод getRemoteSocketAddress возвращает объект типа SocketAddress . Это абстрактный класс Java. В данном случае мы знаем, что это соединение TCP/IP, поэтому мы можем привести его к InetSocketAddress :

 InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress(); 

Как мы уже видели, адрес сокета представляет собой комбинацию IP-адреса и номера порта. Мы можем использовать getAddress для получения IP-адреса . Это возвращает объект InetAddress . Однако мы также можем использовать getHostAddress для получения строкового представления IP-адреса :

 String clientIpAddress = socketAddress.getAddress()   .getHostAddress(); 

4.3. Отправка приветственного сообщения клиенту​

Теперь сервер и клиент могут обмениваться приветственными сообщениями:

 String msg = in.readLine();   System.out.println("Message received from the client :: " + msg);   PrintWriter out = new PrintWriter(connectedSocket.getOutputStream(), true);  out.println("Hello Client !!"); 

5. Протестируйте приложение​

Давайте теперь создадим клиентское приложение для тестирования нашего кода. Этот клиент будет работать на отдельном компьютере и подключаться к нашему серверу.

5.1. Создайте клиентское приложение​

Во- первых, нам нужно установить соединение Socket со службой, используя IP-адрес и номер порта:

 public class ApplicationClient    public void connect(String ip, int port) throws IOException    clientSocket = new Socket(ip, port);   >   > 

Подобно серверному приложению, мы будем использовать BufferedReader и PrintWriter для чтения и записи в сокет. Для отправки сообщений на сервер создадим метод для записи в подключенный сокет:

 public void sendGreetings(String msg) throws IOException    out.println(msg);   String reply = in.readLine();   System.out.println("Reply received from the server :: " + reply);   > 

5.2. Запустите приложение​

Далее запустим клиентское приложение, выбрав для него свободный порт .

После этого нам нужно запустить клиентское приложение с другого ПК. Для этого примера предположим, что IP-адрес сервера — 192.168.0.100 , а порт 5000 свободен:

 java -cp com.foreach.clientaddress.ApplicationClient 192.168.0.100 5000 Hello 

Здесь мы предполагаем, что клиент и сервер находятся в одной сети. После того, как клиент установит успешное соединение с сервером, IP-адрес клиента будет напечатан на консоли сервера.

Если IP-адрес клиента, например, 192.168.0.102, мы должны увидеть его в консоли:

 IP address of the connected client :: 192.168.0.102 

5.3. Что произошло на заднем плане?​

Как правило, когда сервер приложений запускается, ServerSocket создает экземпляр объекта сокета, используя заданный номер порта и IP-адрес с подстановочным знаком. После этого он меняет свой статус на «Прослушивание» для входящих запросов на подключение . Затем, когда клиент отправляет запрос на подключение, ServerSocket создает экземпляр нового сокета, вызывая метод accept .

Вновь созданный экземпляр сокета содержит IP-адрес и порт сервера, а также удаленного клиента. В качестве IP-адреса сервера класс ServerSocket использует IP-адрес локального сетевого интерфейса, через который он получил входящий запрос. Затем, чтобы получить IP-адрес удаленного клиента, он декодирует IP-заголовок полученного TCP-пакета и использует исходный адрес.

6. Заключение​

В этой статье мы определили пример использования клиент-сервер и использовали программирование сокетов Java, чтобы найти IP-адрес клиента, подключенного к серверу.

Как всегда, код этого приложения доступен на GitHub .

Источник

Как получить IP-адрес клиента в Java

В Java вы можете использовать HttpServletRequest.getRemoteAddr() , чтобы получить IP-адрес клиента, который обращается к вашему веб-приложению Java.

import javax.servlet.http.HttpServletRequest; String ipAddress = request.getRemoteAddr();

1. Прокси-сервер или Cloudflare

Для веб-приложения, которое находится за прокси-сервером, балансировщиком нагрузки или популярным решениемCloudflare, вы должны получить IP-адрес клиента через заголовок HTTP-запросаX-Forwarded-For (XFF).

import javax.servlet.http.HttpServletRequest; //. private static String getClientIp(HttpServletRequest request) < String remoteAddr = ""; if (request != null) < remoteAddr = request.getHeader("X-FORWARDED-FOR"); if (remoteAddr == null || "".equals(remoteAddr)) < remoteAddr = request.getRemoteAddr(); >> return remoteAddr; >

2. Не работает до сих пор?

Просмотрите заголовок HTTP-запроса клиента и попытайтесь определить, где хранится IP-адрес.

private Map getRequestHeadersInMap(HttpServletRequest request) < Mapresult = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) < String key = (String) headerNames.nextElement(); String value = request.getHeader(key); result.put(key, value); >return result; >

Примеры заголовков запросов для веб-приложений, стоящих за Cloudflare.

"referer" :"https://www.google.com/", "cf-ipcountry" :"US", "cf-ray" :"348c7acba8a02210-EWR", "x-forwarded-proto" :"https", "accept-language" :"en-US,en;q=0.8", "cookie" :"__cfduid=d3c6e5d73aa55b6b42fad9600c94849851490726068; _ga=GA1.2.450731937.1490726069", "x-forwarded-for" :"100.8.204.40", // ", "host" :"127.0.0.1:8080", "upgrade-insecure-requests" :"1", "connection" :"close", "cf-connecting-ip" :"100.8.204.40", "accept-encoding" :"gzip", "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"

Note
Обычно перед тем, как веб-сервер / прокси-сервер пересылает запрос на сервер приложений Java, он сохраняет реальный клиентский IP-запрос под стандартным именем заголовка, например x-forwarded-for , если вы можете Не можете найти IP-адрес клиента во всех заголовках запроса, попробуйте обсудить его с администратором вашего сервера.

Рекомендации

Источник

Как получить IP-адрес клиента в Java

В Java вы можете использовать HttpServletRequest.getRemoteAddr() чтобы получить IP-адрес клиента, который обращается к вашему веб-приложению Java.

 import javax.servlet.http.HttpServletRequest; String ipAddress = request.getRemoteAddr(); 

1. Прокси-сервер или Cloudflare

Для веб-приложения, которое находится за прокси-сервером, балансировщиком нагрузки или популярным решением Cloudflare , вы должны получить IP-адрес клиента через заголовок HTTP-запроса X-Forwarded-For (XFF) .

 import javax.servlet.http.HttpServletRequest; // . private static String getClientIp(HttpServletRequest request) < String remoteAddr = ""; if (request != null) < remoteAddr = request.getHeader("X-FORWARDED-FOR"); if (remoteAddr == null || "".equals(remoteAddr)) < remoteAddr = request.getRemoteAddr(); >> return remoteAddr; > 

2. Не работает до сих пор?

Просмотрите заголовок HTTP-запроса клиента и попытайтесь определить, где хранится IP-адрес.

 private Map getRequestHeadersInMap(HttpServletRequest request) < Mapresult = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) < String key = (String) headerNames.nextElement(); String value = request.getHeader(key); result.put(key, value); >return result; > 

Примеры заголовков запросов для веб-приложений, стоящих за Cloudflare.

 "referer" :"https://www.google.com/», "cf-ipcountry" :"US", "cf-ray" :"348c7acba8a02210-EWR", "x-forwarded-proto" :"https", "accept-language" :"en-US,en;q=0.8", "cookie" :"__cfduid=d3c6e5d73aa55b6b42fad9600c94849851490726068; _ga=GA1.2.450731937.1490726069", "x-forwarded-for" :"100.8.204.40", // ", "host" :"127.0.0.1:8080", "upgrade-insecure-requests" :"1", "connection" :"close", "cf-connecting-ip" :"100.8.204.40", "accept-encoding" :"gzip", "user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" 

Заметка
Обычно, прежде чем веб / прокси-сервер перенаправит запрос на сервер приложений Java, он сохранит IP-запрос реального клиента в стандартном имени заголовка, например x-forwarded-for Если вы не можете найти IP-адрес клиента во всех заголовках запроса, попробуйте обсудить его с администратором сервера.

Рекомендации

Источник

Оцените статью