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

  • Post author:
  • Post category:java


这几天搞了用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” οnclick=”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 =fetchExternalIpProviderH

TML(externalIpProviderUrl);








parse(returnedhtml);




}




privateString fetchExternalIpProviderH

TML(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

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



版权声明:本文为ye1992原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。