java获取客户端请求IP地址 获取公网ip

简介:

这几天搞了用java获取ip地址,由于测试方法不对,一直没有成功,昨天终于想通了并不是方法不对,而是我的测试方法不对,下面这个方法,完全可以得到客户端的公网ip地址

但是在测试的时候注意:我用的是weblogic测试的,在我的本机上开启服务,然后访问,由于同在一个局域网,因此下面这个方法返回的ip地址是127.0.0.1,而同在一个局域网的机器访问的时候返回的ip是这台机器的ip地址192.168.1.151,而外网的客户端访问的时候(这里不是说测试服务器可以被外网访问到),返回的ip是外网客户端的公网ip地址

 public String getIpAddr(HttpServletRequestrequest) {
    String ip = request.getHeader("x-forwarded-for");
    if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if(ip == null || ip.length() == 0 ||"unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }
    return ip;
 }

对于在jsp得到客户端的ip地址有下面的方法

1.<input type="hidden" id="jiqiIP" name="jiqiIP"value="<%=request.getRemoteAddr()%>"/> 

同样分情况,本机访问的时候,value是127.0.0.1同在局域网里的其他机器的value是他们机器的ip,外网的也是他们机器的ip,不是客户端公网ip地址,这个没法得到客户端公网的ip

2.<script language="JavaScript" src="http://www.hashemian.com/js/visitorIP.js.php"></script>这一段,可以得到客户端的公网ip地址,只是我没有用这个方法得公网ip我用的是上面的java方法

3.<iframe src="http://www.ip138.com/ip2city.asp"id="frame1"></iframe>用这个iframe也可以得到客户端公网ip,但是IE却很难得到iframe里面的值,不论是控制iframe还是用ajax访问那个url路径都不能得到,因为IE会报错说拒绝访问,最主要的原因是你跨域了(从网上找到的:如果可以跨的话,你不是可以随便修改别人网站的内容了吗?比如你在iframe里加载了百度,你又能通过js控制它,这不是为黑客提供了便利的途径吗),因此无法得到ip,当你不跨域的时候是可以的,如下
myiframe.contentWindow.document.body.innerHTML方式直接通过iframe的id引用,只有IE系列浏览器支持,在其它标准浏览器中无效。

火狐还支持这种方法得到iframe的值,但是IE不支持contentDocument

<html>
<head>
<script type="text/javascript">
function getText(){
  varx=document.getElementByIdx_x_x_x_x("frame1").contentDocument;
 alert(x.getElementsByTagName_r("h3")[0].childNodes[0].nodeValue);
 }
</script>
</head>
<body>

<iframe src="http://www.ip138.com/ip2city.asp"id="frame1"></iframe>
<br /><br/>
<input type="button" onclick="getText()" value="Gettext" />

</body>
</html>

下面还有一个类可以得到服务器所在的公网ip

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExternalIpAddressFetcher {
    //外网IP提供者的网址
    privateString externalIpProviderUrl;

    //本机外网IP地址
    privateString myExternalIpAddress;

    publicExternalIpAddressFetcher(String externalIpProviderUrl) {
       this.externalIpProviderUrl = externalIpProviderUrl;

       String returnedhtml =fetchExternalIpProviderHTML(externalIpProviderUrl);
       parse(returnedhtml);
    }
    privateString fetchExternalIpProviderHTML(String externalIpProviderUrl){
       // 输入流
       InputStream in = null;
       // 到外网提供者的Http连接
       HttpURLConnection httpConn = null;

       try {
           // 打开连接
           URL url = new URL(externalIpProviderUrl);
           httpConn = (HttpURLConnection)url.openConnection();         
           // 连接设置
           HttpURLConnection.setFollowRedirects(true);
           httpConn.setRequestMethod("GET");
           httpConn.setRequestProperty("User-Agent",
                   "Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");

           // 获取连接的输入流
           in = httpConn.getInputStream();
           byte[] bytes=new byte[1024];// 此大小可根据实际情况调整 
           // 读取到数组中
           int offset = 0;
           int numRead = 0;
           while (offset < bytes.length
                  && (numRead=in.read(bytes, offset,bytes.length-offset)) >= 0) {
               offset += numRead;
           } 
           //将字节转化为为UTF-8的字符串       
           String receivedString=newString(bytes,"UTF-8");    
           // 返回
           return receivedString;
       } catch (MalformedURLException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } finally {
           try {
               in.close();
               httpConn.disconnect();
           } catch (Exception ex) {
               ex.printStackTrace();
           }
       }

       // 出现异常则返回空
       return null;
    }
    private voidparse(String html){
       Pattern pattern=Pattern.compile("(\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})",Pattern.CASE_INSENSITIVE);   
       Matchermatcher=pattern.matcher(html);       
       while(matcher.find()){
           myExternalIpAddress=matcher.group(0);
       }   
   }   
    publicString getMyExternalIpAddress() {
       return myExternalIpAddress;
    }
    publicstatic void main(String[] args){
       ExternalIpAddressFetcher fetcher=newExternalIpAddressFetcher("http://checkip.dyndns.org/");
       System.out.println(fetcher.getMyExternalIpAddress());
    }
}

使用的时候

ExternalIpAddressFetcher fetcher=newExternalIpAddressFetcher("http://checkip.dyndns.org/");

System.out.println(fetcher.getMyExternalIpAddress());

fetcher.方法名即可,但是这个类 如果你在后台(服务器端)调用这个方法的话,得到的是服务器的公网ip

就这些吧 希望可以帮助到需要帮助的

相关文章
|
17天前
|
JSON NoSQL Java
Redis入门到通关之Java客户端SpringDataRedis(RedisTemplate)
Redis入门到通关之Java客户端SpringDataRedis(RedisTemplate)
218 0
|
11天前
|
Java Apache 网络架构
Java用于远程调用的客户端都有什么
【5月更文挑战第18天】Java用于远程调用的客户端都有什么
26 5
|
15天前
|
JSON Java 数据安全/隐私保护
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
java中的http请求的封装(GET、POST、form表单、JSON形式、SIGN加密形式)
|
1天前
|
网络协议 Java
Java的Socket编程:TCP/IP与UDP深入探索
Java的Socket编程:TCP/IP与UDP深入探索
6 0
|
7天前
|
存储 Java 编译器
Java | 如何从内存解析的角度理解“数组名实质是一个地址”?
这篇文章讨论了Java内存的简化结构以及如何解析一维和二维数组的内存分配。在Java中,内存分为栈和堆,栈存储局部变量,堆存储通过`new`关键字创建的对象和数组。方法区包含静态域和常量池。文章通过示例代码解释了一维数组的创建过程,分为声明数组、分配空间和赋值三个步骤,并提供了内存解析图。接着,介绍了二维数组的内存解析,强调二维数组是“数组的数组”,其内存结构中,外层元素存储内层数组的地址。最后,文章提到了默认初始化方式对初始值的影响,并给出了相关测试代码。
14 0
|
8天前
|
SQL Java 数据处理
实时计算 Flink版产品使用合集之在生产运行方式中是嵌入java代码还是在客户端
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
15天前
|
Java
java使用AOP切面获取请求日志并记录
java使用AOP切面获取请求日志并记录
|
17天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
15 0
|
17天前
|
Java
JavaFX库用于在Java中绘制K线图,适合构建富客户端应用。
JavaFX库用于在Java中绘制K线图,适合构建富客户端应用。以下是一个简单的K线图绘制示例:创建OHLCChart,设置标题和坐标轴,创建数据集并添加数据点,最后显示在Scene中。要定制图表外观,可利用JavaFX的丰富参数和方法。查阅JavaFX文档以获取更多细节。
29 3
|
17天前
|
存储 Java 定位技术
【Java】根据IP地址获取省市
【Java】根据IP地址获取省市
89 1