现在手头开发一个网站,有这么一个功能,就是根据访问者的IP自动显示访问者所在的区域;
现在遇到了一问题,我得到客户端IP的代码如下:
[code="java"]
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)
|| "null".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)
|| "null".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)
|| "null".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
[/code]
该代码得到的结果如下:
1.如果应用发布到局域网,在局域网内访问,得到的是我局域网的IP,如: 192.168.0.2
2.如果我将应用发布到独立IP的外网服务器上面,在任何地方访问,得到的IP总是 192.168.198.1,这一类局域网的IP段
我现在就是想在第二种情况下能够得到访问者的外网ip,请问各位有什么高招?
我是这样子做,如果获取到的IP是局域网的,那么我会调用一个访问www.ip138.com这个网站,然后解析它,从而得到你的外网IP。
这个结果应该是因为使用了路由器的原因吧
如果你的主机是代理的(proxy),需要在代理程序上处理.
跟你原理,多在几个服务端测试下。如有可能发地址出来,大家测试一下
http://www.blogjava.net/etlan/archive/2008/11/26/242801.html
局域网本来就是一般都是只有一个外部ip的,这是由网络本身的设计导致,
虽然网上也很多查ip地址的网站,比较查询当前访问地址,都还是局域网的ip
//获得客户端真实IP地址:
public String getIpAddr(HttpServletRequest request) {
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;
}
试试这个方法
你用java urlconnection去访问http://www.ip138.com/,返回来的HTML文档会
您的IP地址是:[114.117.75.137] ,然后你去解析HTML文档,获取到114.117.75.137外网IP,这样就行了。
晚上再帮你写个好了
根据你的要求。
程序可以分为两步走。
第一,我网段在0-255之间,并且192.168这个条件的基础下
用你上面的代码指定是得不到访问者的外网IP。
在同一个局域网下,获得访问者的外网IP地址,办法如下:
[code="java"]
public String getWebIp() {
try {
URL url = new URL(""http://www.ip138.com/ip2city.asp"");
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
String s = "";
StringBuffer sb = new StringBuffer("");
String webContent = "";
while ((s = br.readLine()) != null) {
sb.append(s + "\r\n");
}
br.close();
webContent = sb.toString();
int start = webContent.indexOf("[")+1;
int end = webContent.indexOf("]");
webContent = webContent.substring(start,end);
return webContent;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
[/code]
其他情况,使用你那个应该没错。还没测试过别人用代理的情况,是否能够获取到用户真实的IP地址。你也可以测试一下。
加我563538333
[code="java"]
String clientIp = req.getHeader("true-client-ip");
if (clientIp == null || clientIp.equals("")) {
clientIp = req.getHeader("Proxy-Client-IP");
}
if (clientIp == null || clientIp.equals("")) {
clientIp = req.getRemoteAddr();
}
[/code]