- Как получить Ip-адрес клиента на Java
- 1. Прокси-сервер или Cloudflare
- 2. Все еще не работаешь?
- Рекомендации
- Найдите IP-адрес клиента, подключенного к серверу
- 2. Фон
- 3. Пример использования
- 4. Образец заявления
- 4.1. Сервер приложений
- 4.2. Получение IP-адреса клиента
- 4.3. Отправка приветственного сообщения клиенту
- 5. Протестируйте приложение
- 5.1. Создайте клиентское приложение
- 5.2. Запустите приложение
- 5.3. Что произошло на заднем плане?
- 6. Заключение
- Как получить IP-адрес клиента в Java
- 1. Прокси-сервер или Cloudflare
- 2. Не работает до сих пор?
- Рекомендации
- Как получить IP-адрес клиента в Java
- 1. Прокси-сервер или Cloudflare
- 2. Не работает до сих пор?
- Рекомендации
Как получить 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 MapgetRequestHeadersInMap(HttpServletRequest request) < Map result = 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"
Рекомендации
Найдите 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-адрес клиента во всех заголовках запроса, попробуйте обсудить его с администратором сервера.