- 浏览: 2262636 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (423)
- FileNet相关 (3)
- 应用服务器相关 (22)
- Java综合 (77)
- 持久层 (24)
- struts (11)
- webservice (8)
- 虚拟机 (2)
- 光盘刻录 (0)
- AD及AD集群 (1)
- JS (33)
- F5 (0)
- loadrunner8.1 (0)
- Java 反编译工具 (2)
- DataBase (62)
- ant (1)
- 操作系统 (29)
- 我的任务 (3)
- 平台架构 (16)
- 业务规则引擎 (2)
- 模板 (1)
- EJB (5)
- spring (24)
- CMMI (1)
- 项目管理 (20)
- LDAP (13)
- JMS (10)
- JSP (19)
- JBPM (2)
- web MVC框架设计思想 (2)
- 第三方支付平台 (2)
- BUG管理工具 (1)
- 垃圾站 (2)
- php (1)
- swing (1)
- 书籍 (1)
- QQ qq (2)
- 移动互联网 (26)
- 爱听的歌曲 (0)
- hadoop (4)
- 数据库 (9)
- 设计模式 (1)
- 面试经验只谈 (1)
- 大数据 (9)
- sp (1)
- 缓存数据库 (8)
- storm (2)
- taobao (2)
- 分布式,高并发,大型互联网,负载均衡 (6)
- Apache Ignite (0)
- Docker & K8S (0)
最新评论
-
wangyudong:
新版本 Wisdom RESTClienthttps://gi ...
spring rest mvc使用RestTemplate调用 -
wangyudong:
很多API doc生成工具生成API文档需要引入第三方依赖,重 ...
spring rest mvc使用RestTemplate调用 -
zhaoshijie:
cfying 写道大侠,还是加载了两次,怎么解决啊?求。QQ: ...
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
xinglianxlxl:
对我有用,非常感谢
spring容器加载完毕做一件事情(利用ContextRefreshedEvent事件) -
k_caesar:
多谢,学习了
利用maven的resources、filter和profile实现不同环境使用不同配置文件
关键字:用Java来获取访问者真实的IP地址-超准确
下面分享一下很多朋友都问过的一个问题,即:关键无法获取访问用户的真实IP问题:答案如下:
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
获得客户端真实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;
}
可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:
X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为: 192.168.1.110
函数:
/**
* 获取访问用户的客户端IP(适用于公网与局域网).
*/
public static final String getIpAddr(final HttpServletRequest request)
throws Exception {
if (request == null) {
throw (new Exception("getIpAddr method HttpServletRequest Object is null"));
}
String ipString = request.getHeader("x-forwarded-for");
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getRemoteAddr();
}
// 多个路由时,取第一个非unknown的ip
final String[] arr = ipString.split(",");
for (final String str : arr) {
if (!"unknown".equalsIgnoreCase(str)) {
ipString = str;
break;
}
}
return ipString;
}
另外判断是否内网IP(待验证 暂时不可用):
/**
* 是否内网IP
* @param ip
* @return
*/
public static boolean isInner(String ip)
{
String reg = "(10|172|192)\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})";//正则表达式=。 =、懒得做文字处理了、
Pattern p = Pattern.compile(reg);
Matcher matcher = p.matcher(ip);
return matcher.find();
}
下面分享一下很多朋友都问过的一个问题,即:关键无法获取访问用户的真实IP问题:答案如下:
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或192.168.1.110,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的 IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问index.jsp/时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (request.getHeader("x-forwarded-for") == null) {
return request.getRemoteAddr();
}
return request.getHeader("x-forwarded-for");
}
获得客户端真实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;
}
可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢?
答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:
X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为: 192.168.1.110
函数:
/**
* 获取访问用户的客户端IP(适用于公网与局域网).
*/
public static final String getIpAddr(final HttpServletRequest request)
throws Exception {
if (request == null) {
throw (new Exception("getIpAddr method HttpServletRequest Object is null"));
}
String ipString = request.getHeader("x-forwarded-for");
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
ipString = request.getRemoteAddr();
}
// 多个路由时,取第一个非unknown的ip
final String[] arr = ipString.split(",");
for (final String str : arr) {
if (!"unknown".equalsIgnoreCase(str)) {
ipString = str;
break;
}
}
return ipString;
}
另外判断是否内网IP(待验证 暂时不可用):
/**
* 是否内网IP
* @param ip
* @return
*/
public static boolean isInner(String ip)
{
String reg = "(10|172|192)\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})\\.([0-1][0-9]{0,2}|[2][0-5]{0,2}|[3-9][0-9]{0,1})";//正则表达式=。 =、懒得做文字处理了、
Pattern p = Pattern.compile(reg);
Matcher matcher = p.matcher(ip);
return matcher.find();
}
发表评论
-
利用tomcat服务器配置https双向认证、https单向认证-ssl、tls
2015-05-29 15:25 4228关键字:利用tomcat服务器配置https双向认证、http ... -
Dubbo Main启动方式浅析
2015-05-27 13:54 15456关键字:Dubbo Main启动方式浅析 服务容器是一个s ... -
淘宝可伸缩高性能互联网架构--整体架构介绍
2015-05-14 13:21 12681推荐综合架构交流群:JAVA开发高级群 点击入群!!! 关键 ... -
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
2015-04-30 11:02 1091关键字:淘宝JAVA中间件Diamond详解(一)---简介& ... -
各大巨头电商提供的IP库API接口-新浪、搜狐、阿里...
2015-04-22 13:18 15912关键字:各大巨头电商提供的IP库API接口-新浪、搜狐、阿里. ... -
Shiro集成OAuth2
2015-04-21 10:31 12447关键字:Shiro集成OAuth2 参考:http://jin ... -
淘宝网架构分享总结 - 架构,分布式,淘宝,虚拟化,水平伸缩
2015-04-19 00:25 7638推荐综合架构交流群:JAVA开发高级群 点击入群!!! 关键 ... -
高可用、开源的Redis缓存集群方案
2015-04-16 12:25 3758推荐综合架构交流群:J ... -
Zookeeper 和 SASL
2015-04-16 09:29 13639关键字:Zookeeper 和 SASL 介绍 这是一个描述Z ... -
非对称加密(RSA)加密解密实现通信JAVA端工具类(教程)
2015-04-15 17:27 1185关键字:非对称加密(RSA)加密解密实现通信JAVA端工具类( ... -
对称加密(AES)加密实现工具类(教程)
2015-04-15 17:11 2147关键字:对称加密(AES)加密实现工具类(教程) Java加 ... -
各种Nosql数据库系统对比及应用场景分析
2015-04-15 16:29 756关键字:各种Nosql数据库系统对比及应用场景分析 导读:Kr ... -
Curator-Framework开源Zookeeper快速开发框架介绍
2015-04-14 18:41 703关键字:Curator-Framework开源Zookeepe ... -
IM消息推送之Openfire
2015-04-13 13:40 2217关键字:IM消息推送之Openfire Openfire 采用 ... -
Nio框架之Mina的demo
2015-04-12 13:38 646关键字:Nio框架之Mina的demo 官网:http://m ... -
Zookeeper中ACL(访问控制列表)
2015-04-10 17:21 2828关键字:Zookeeper中ACL( ... -
Mongodb命令大全
2015-03-18 11:18 803关键字:Mongodb命令大全 他支持的数据结构非常松散,是类 ... -
Myeclipse错误:Errors occurred during the build. Errors running builder 'Deployment
2015-02-15 10:17 3500本文向大家讲解了Myeclipse错误:Errors occ ... -
AMQP中文版协议规范
2015-01-23 17:12 2990关键字:AMQP中文版协议规范 AMQP中文版协议规范:ht ... -
安装ZooKeeper(单机、伪集群、集群)
2015-01-15 11:02 10472关键字:安装ZooKeeper(单机、伪集群、集群) 推荐 ...
相关推荐
### 使用Java获取访问者真实IP地址 在现代Web开发中,获取客户端的真实IP地址是非常重要的。这不仅有助于网站统计分析,还可以用于安全控制、地域限制等功能。然而,在使用如Apache、Squid等反向代理服务器的情况下...
### 获取访问者真实的IP地址 在现代Web应用开发过程中,获取客户端的真实IP地址是一项非常重要的功能。这不仅可以帮助我们分析用户行为、优化服务,还能用于安全防护,例如防止恶意攻击等场景。本文将详细介绍如何...
在Web开发中,经常需要获取客户端的真实IP地址来进行一系列的操作,比如统计访问来源、进行地理定位、安全防护等。然而,在实际应用场景中,客户端请求往往经过了多级代理(如Apache、Squid等),这使得直接使用`...
### JSP中获取浏览者真实IP地址的详细解析 在Web开发中,获取客户端的IP地址是一项基础且重要的功能,特别是在需要追踪用户地理位置、限制访问权限或是进行数据分析时。然而,在复杂的网络环境中,如存在代理服务器...
1. **连接SNMP代理**:使用SNMP库建立与目标交换机的连接,通常需要指定SNMP代理的IP地址、端口号、版本(如v1、v2c)、团体名(Community String)等参数。 2. **构建PDU(Protocol Data Unit)**:创建一个Get...
在Java编程中,获取本机IP地址有多种方法,而从网页抓取IP地址是一种间接的方式。这个方法涉及网络连接、网页解析以及正则表达式的应用。以下是一个具体的示例,展示了如何通过Java代码从指定网页抓取本机IP地址。 ...
- **Java**:使用`InetAddress`类,`InetAddress.getLocalHost().getHostAddress()`获取IP地址。 - **JavaScript**:在浏览器环境中,可以利用`navigator.connection`或`fetch` API获取网络信息,但需要注意跨域...
标题中的“ip查询库java版(含IP地址库)”指的是一个Java实现的IP查询库,它包含了一个IP地址数据库,可以用于根据输入的IP地址获取对应国家、地区和详细地址等信息。这样的库在Web应用、网络安全分析或者网络日志...
例如,网站可能需要根据访问者的IP来提供地区性的服务或内容。Java作为广泛使用的编程语言,提供了多种方法实现通过IP地址查询地理位置信息。 首先,我们可以通过访问一些提供IP地址定位服务的公共服务API接口来...
2. **统计分析**:收集访问者IP地址有助于进行流量分析,了解用户的地理位置分布等。 3. **个性化体验**:根据用户的IP地址可以提供更加个性化的服务或内容。 4. **地域限制**:某些网站或服务可能仅限于特定地区的...
获取本地计算机IP地址,可以使用命令行(如Windows的`ipconfig`或Linux的`ifconfig`)或编程方式(如Python的`socket.gethostbyname(socket.gethostname())`或Java的`InetAddress.getLocalHost().getHostAddress()`...
在JSP开发中,获取客户端的真实IP地址是一个常见需求,尤其在需要进行安全验证、日志...开发者需要根据不同部署环境采取不同的策略,确保能够准确无误地获取客户端的真实IP地址,以便于更好地进行应用管理和安全控制。
总的来说,IP2Location Lite DB3 CSV数据库提供了一种高效且准确的方法来定位全球IP地址,其在网络安全、网站分析、地理定向广告等领域具有广泛的应用。开发者应当遵循提供的许可证和说明,合理利用这一工具,以满足...
在Java语言开发的Web应用中,尤其是在使用Java Server Pages(JSP)技术时,获取客户端的IP地址是常见的需求之一,这可以用于日志记录、用户访问统计、安全性检查等多种场景。本文详细介绍了几种在JSP中获取客户端IP...
同时,由于IP地址可以被代理和虚拟化,查询到的信息可能并不完全准确,可能需要结合其他信息来定位真实的客户端位置。 在提供的压缩包文件"IPAddress"中,可能包含了实现上述功能的代码示例、库文件或文档。通过...
GeoIP通过IP地址与特定的地理信息关联起来,从而确定访问者所在的国家、城市甚至经纬度。本代码包聚焦于如何利用GeoIP服务获取IP地址的归属地,并将获取到的国家编码转换成中文名称。 首先,`GeoIP.dat`是GeoIP...
在IT行业中,IP地址解析库是一种非常重要的工具,它能够帮助开发者快速地获取与特定IP地址相关联的地理位置信息。本库专注于IP地址到城市级别的地理定位,这在网络安全、数据分析、用户行为追踪以及多种网络服务中都...
8. 应用场景:GeoLite2-City数据库在很多方面都有应用,例如网站统计分析(了解访问者来自哪里)、广告定位(向用户展示与其地理位置相关的广告)、内容过滤(阻止特定地区的用户访问)和欺诈检测(通过IP地址判断...
Java IP (InetAddress) Locator 是一个开源项目,主要用于通过IP地址获取对应的国家代码和语言信息。这个库在Java和ColdFusion环境中都能使用,极大地便利了开发者在处理网络数据时进行地理位置相关的分析和处理。其...
5. **CDN统计**:如果网站使用了CDN(内容分发网络),则可以从CDN服务商获取访问统计信息,包括IP地址。CDN能够分散流量,提高网站访问速度,同时也提供了统计功能。 在源代码和源码方面,开发者通常会用编程语言...