有没有遇到过这样的情况:正在开发一个网络应用程序,突然需要获取用户的IP地址,就开始在网上搜索各种方法,却不知道哪种方法最合适。这就像是在找老婆,每个人都有自己的独特品味,总要试几个才能找到最适合自己的那个。不过别担心,作为一个Java程序员,我来告诉Java中获取IP地址的几种方法,以及它们各自的优缺点,让你可以轻松选到自己心仪的"老婆"。
第一种方法是使用`InetAddress`类,它是Java提供的一个封装IP地址功能的类。代码就像这样:
```javaInetAddress address = InetAddress.getLocalHost();
String ip = address.getHostAddress();
```这种方法简单直接,而且能得到本机的IP地址,很适合在单机环境下使用。不过如果你的应用程序需要获取远程主机的IP地址,那这个方法就不太合适。因为`InetAddress.getLocalHost()`只能获取本机的IP地址,无法获取远程主机的信息。
第二种方法是使用`NetworkInterface`类。这个类可以获取网卡的相关信息,包括IP地址。代码如下:
```java
Enumeration
while (networks.hasMoreElements()) {
NetworkInterface network = networks.nextElement();
Enumeration
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (address instanceof Inet4Address) {
String ip = address.getHostAddress();
// do something with the IP address
}}}```这种方法可以获取多个网卡的IP地址,对于有多个网卡的机器来说很有用。不过对于有些特殊的网络环境,比如docker容器,这个方法可能就无法获取到正确的IP地址。
第三种方法是使用第三方库,比如Apache的`HttpClient`。这种方法是通过发送HTTP请求到一些公开的IP查询服务,解析返回的结果来获取IP地址。代码如下:
```javaCloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("http://icanhazip.com/");
CloseableHttpResponse response = httpClient.execute(request);
String ip = IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8).trim();
```这种方法的优点是可以获取到公网IP地址,而不仅仅是本机IP地址。缺点是需要依赖第三方服务,服务挂,你的程序也就跟着瘫痪。而且,你的应用程序需要在内网环境下运行,这个方法也可能无法正常工作。
第四种方法是使用`ServletRequest`对象。你的应用程序是运行在Web容器(如Tomcat)上的,那么可以直接从`HttpServletRequest`对象中获取客户端IP地址。代码如下:
```javaString ip = request.getRemoteAddr();
```这种方法非常简单,而且能够直接获取到客户端的IP地址。不过它也有一些局限性,比如在反向代理或者负载均衡的环境下,可能无法获取到真实的客户端IP地址。
Java中获取IP地址的方法虽然有很多,但每种方法都有自己的优缺点。需要根据自己的应用场景和需求,选择最合适的方法。你的应用程序运行在Web容器上,那么使用`ServletRequest`对象是最简单的方法。需要获取本机IP地址,那么使用`InetAddress`类就可以。需要获取远程主机的IP地址,那么使用`NetworkInterface`类或者第三方库会更合适。无论选择哪种方法,希望这篇文章能够帮助找到适合自己的"老婆"。
java中怎么获取客户端的真实的IP-CSDN论坛
在JSP里,获取客户端的IP地址的方法是(),这种方法在大部分情况下都是有效的。 但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。 如果使用了反向代理软件,将:2046/ 的URL反向代理为/ 的URL时,用()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。 但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。 用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。 当我们访问// 时,其实并不是我们浏览器真正访问到了服务器上的文件,而是先由代理服务器去访问:2046/ ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问的,所以中通过()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。 于是可得出获得客户端真实IP地址的方法一:Java code? public String getRemortIP(HttpServletRequest request) {if ((x-forwarded-for) == null) { return ();}return (x-forwarded-for); } 可是当我访问// 时,返回的IP地址始终是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我访问:2046/ 时,则能返回客户端的真实IP地址,写了个方法去验证。 原因出在了Squid上。 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off则:X-Forwarded-For: unknown于是可得出获得客户端真实IP地址的方法二:Java code? public String getIpAddr(HttpServletRequest request) { String ip = (x-forwarded-for); if(ip == null || () == 0 || (ip)) { ip = (Proxy-Client-IP); } if(ip == null || () == 0 || (ip)) { ip = (WL-Proxy-Client-IP); } if(ip == null || () == 0 || (ip)) { ip = (); } return ip; } 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。 如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100用户真实IP为: 192.168.1.110更多Java精彩课程请点击:
如何在java中获取本地ip
很多朋友都想知道java如何获取本地ip?下面就一起来了解一下吧~
获取java本地ip一共有两种方法:1、inetAddress类;2、封装方法。
1、 inetAddress类
通过InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。 InetAddress类提供了将主机名解析为IP地址(或反之)的方法。 其生成InetAddress对象的方法。
4Address;;;publicclassMain{publicstaticvoidmain(String[]args)throwsUnknownHostException{//Inet4Addressaddress=(Inet4Address)();InetAddressaddress=();(address);//获取计算机名称和ip地址StringhostAddress=();(hostAddress);//获取ip地址StringhostName=();(hostName);//获取计算机名称}}2、封装方法。
publicstaticStringgetLocalIp(){Enumeration netInterfaces=null;try{netInterfaces=();while(()){NetworkInterfacenif=();Enumeration InetAddress=();while(()){Stringip=()();if((192.168)){returnip;}}}}catch(SocketExceptione){}return127.0.0.1;}java中如何获取到本机的外网ip地址?
java获取本机的外网ip示例:import ;import ;import ;import ;import ;import ;import ;/** * 获取本机外网IP地址 * 思想是访问网站,得到返回的文本后解析出本机在外网的IP地址 * @author pieryon * */public class ExternalIpAddressFetcher {// 外网IP提供者的网址private String externalIpProviderUrl;// 本机外网IP地址private String myExternalIpAddress;public ExternalIpAddressFetcher(String externalIpProviderUrl) { = externalIpProviderUrl;String returnedhtml = fetchExternalIpProviderHTML(externalIpProviderUrl);parse(returnedhtml);}/** * 从外网提供者处获得包含本机外网地址的字符串 * 从返回的字符串如下 * <html><head><title>Current IP Check</title></head><body>Current IP Address: 123.147.226.222</body></html> * @param externalIpProviderUrl * @return */private String fetchExternalIpProviderHTML(String externalIpProviderUrl) {// 输入流InputStream in = null;// 到外网提供者的Http连接HttpURLConnection httpConn = null;try {// 打开连接URL url = new URL(externalIpProviderUrl);httpConn = (HttpURLConnection) ();// 连接设置(true);(GET);(User-Agent,Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000));// 获取连接的输入流in = ();byte[] bytes=new byte[1024];// 此大小可根据实际情况调整// 读取到数组中int offset = 0;int numRead = 0;while (offset < && (numRead=(bytes, offset, -offset)) >= 0) {offset += numRead;}// 将字节转化为为UTF-8的字符串String receivedString=new String(bytes,UTF-8);// 返回return receivedString;} catch (MalformedURLException e) {();} catch (IOException e) {();} finally {try {();();} catch (Exception ex) {();}}// 出现异常则返回空return null;}/** * 使用正则表达式解析返回的HTML文本,得到本机外网地址 * @param html */private void parse(String html){Pattern pattern=((\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3}), _INSENSITIVE);Matcher matcher=(html);while(()){myExternalIpAddress=(0);}}/** * 得到本机外网地址,得不到则为空 * @return */public String getMyExternalIpAddress() {return myExternalIpAddress;}public static void main(String[] args){ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher(}}