1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java获取客户端请求IP地址 获取公网ip

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

时间:2020-01-23 00:19:51

相关推荐

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="/js/visitorIP.js.php"></script>这一段,可以得到客户端的公网ip地址,只是我没有用这个方法得公网ip我用的是上面的java方法

3.<iframe src="/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="/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 .HttpURLConnection;

import .MalformedURLException;

import .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=pile("(\\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){

ExternalIpAddressFetcherfetcher=newExternalIpAddressFetcher("/");

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

}

}

使用的时候

ExternalIpAddressFetcherfetcher=newExternalIpAddressFetcher("/");

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。