在java web中怎么用java代码获取访问者的IP,同时根据访问者的IP判断他是属于那个城市

在java web中怎么用java代码获取访问者的IP,同时根据访问者的IP判断他是属于那个城市,第1张

举个例子,假设服务器端运行的是servlet,客户端(浏览器)发送url到服务器,经过解析,服务器找到并运行相应的servlet程序,在servlet程序中可以接受到用户提交的信息,比如用户提交方式是Get方式,则servlet调用其doGet方法,在doGet方法中,可以通过request获取用户提交的数据(包括ip)

protected void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String ip = requsetgetRemoteAddr();//获取客户端ip

}

获得了ip后就可以查询ip所属地址,可以登录http://wwwip138com/

若要自己编写软件查询,就要连接数据库。

在JSP里,获取客户端的IP地址的方法是:requestgetRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,用requestgetRemoteAddr()方法获取的IP地址是:127001 或 1921681110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问 时,其实并不是我们浏览器真正访问到了服务器上的indexjsp文件,而是先由代理服务器去访问 ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问indexjsp的,所以indexjsp中通过requestgetRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {

if (requestgetHeader("x-forwarded-for") == null) {

return requestgetRemoteAddr();

}

return requestgetHeader("x-forwarded-for");

}

可是当我访问 时,返回的IP地址始终是unknown,也并不是如上所示的127001 或 1921681110了,而我访问 :2046/indexjsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squidconf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {

String ip = requestgetHeader("x-forwarded-for");

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("WL-Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetRemoteAddr();

}

return ip;

}

可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:X-Forwarded-For:1921681110, 1921681120, 1921681130, 1921681100用户真实IP为: 1921681110

java获取本机的外网ip示例:

import javaioIOException;

import javaioInputStream;

import javanetHttpURLConnection;

import javanetMalformedURLException;

import javanetURL;

import javautilregexMatcher;

import javautilregexPattern;

/

获取本机外网IP地址

思想是访问网站http://checkipdyndnsorg/,得到返回的文本后解析出本机在外网的IP地址

@author pieryon

/

public class ExternalIpAddressFetcher {

// 外网IP提供者的网址

private String externalIpProviderUrl;

// 本机外网IP地址

private String myExternalIpAddress;

public ExternalIpAddressFetcher(String externalIpProviderUrl) {

thisexternalIpProviderUrl = externalIpProviderUrl;

String returnedhtml = fetchExternalIpProviderHTML(externalIpProviderUrl);

parse(returnedhtml);

}

/

从外网提供者处获得包含本机外网地址的字符串

从http://checkipdyndnsorg返回的字符串如下

<html><head><title>Current IP Check</title></head><body>Current IP Address: 123147226222</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) urlopenConnection();

// 连接设置

HttpURLConnectionsetFollowRedirects(true);

httpConnsetRequestMethod("GET");

httpConnsetRequestProperty("User-Agent",

"Mozilla/40 (compatible; MSIE 60; Windows 2000)");

// 获取连接的输入流

in = httpConngetInputStream();

byte[] bytes=new byte[1024];// 此大小可根据实际情况调整

// 读取到数组中

int offset = 0;

int numRead = 0;

while (offset < byteslength

&& (numRead=inread(bytes, offset, byteslength-offset)) >= 0) {

offset += numRead;

}

// 将字节转化为为UTF-8的字符串

String receivedString=new String(bytes,"UTF-8");

// 返回

return receivedString;

} catch (MalformedURLException e) {

eprintStackTrace();

} catch (IOException e) {

eprintStackTrace();

} finally {

try {

inclose();

httpConndisconnect();

} catch (Exception ex) {

exprintStackTrace();

}

}

// 出现异常则返回空

return null;

}

/

使用正则表达式解析返回的HTML文本,得到本机外网地址

@param html

/

private void parse(String html){

Pattern pattern=Patterncompile("(\\d{1,3})[](\\d{1,3})[](\\d{1,3})[](\\d{1,3})", PatternCASE_INSENSITIVE);

Matcher matcher=patternmatcher(html);

while(matcherfind()){

myExternalIpAddress=matchergroup(0);

}

}

/

得到本机外网地址,得不到则为空

@return

/

public String getMyExternalIpAddress() {

return myExternalIpAddress;

}

public static void main(String[] args){

ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher("http://checkipdyndnsorg/");

Systemoutprintln(fetchergetMyExternalIpAddress());

}

}

嗨 你好

据网上了解到:

在JSP里,获取客户端的IP地址的方法是:requestgetRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,将http://1921681110:2046/ 的URL反向代理为 http://wwwjavapeixuncomcn / 的URL时,用requestgetRemoteAddr()方法获取的IP地址是:127001 或 1921681110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://wwwjavapeixuncomcn /indexjsp/ 时,其实并不是我们浏览器真正访问到了服务器上的indexjsp文件,而是先由代理服务器去访问http://1921681110:2046/indexjsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问indexjsp的,所以indexjsp中通过requestgetRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) { if (requestgetHeader("x-forwarded-for") == null) { return requestgetRemoteAddr(); } return requestgetHeader("x-forwarded-for"); }

可是当我访问http://www5a520cn /indexjsp/ 时,返回的IP地址始终是unknown,也并不是如上所示的127001 或 1921681110了,而我访问http://1921681110:2046/indexjsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squidconf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) { String ip = requestgetHeader("x-forwarded-for"); if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) { ip = requestgetHeader("Proxy-Client-IP"); } if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) { ip = requestgetHeader("WL-Proxy-Client-IP"); } if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) { ip = requestgetRemoteAddr(); } return ip; }

可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:X-Forwarded-For:1921681110, 1921681120, 1921681130, 1921681100用户真实IP为: 1921681110

希望可以帮到你的忙

祝你学习愉快

public static void main(String[] args) { try { // 获取计算机名 String name = InetAddressgetLocalHost()getHostName(); // 获取IP地址 String ip = InetAddressgetLocalHost()getHostAddress(); Systemoutprintln("计算机名:"+name); Systemoutprintln("IP地址:"+ip); } catch (UnknownHostException e) { Systemoutprintln("异常:" + e); eprintStackTrace(); } }

是否可以解决您的问题?

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 在java web中怎么用java代码获取访问者的IP,同时根据访问者的IP判断他是属于那个城市

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情