在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。
如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的URL时,用request.getRemoteAddr() 方法获取的IP地址是:127.0.0.1 或 192.168.1.110 ,而并不是客户端的真实IP。
经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问http://www.xxx.com/index.jsp/ 时,其实并不是我们浏览器真正访问到了服务器上的index.jsp文件,而是先由代理服务器去访问http://192.168.1.110:2046/index.jsp ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问index.jsp的,所以index.jsp中通过request.getRemoteAddr() 的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。于是可得出获得客户端真实IP地址的方法一:

Java代码  
  1. public String getRemortIP(HttpServletRequest request) {
  2. if (request.getHeader("x-forwarded-for") == null) {
  3. return request.getRemoteAddr();
  4. }
  5. return request.getHeader("x-forwarded-for");
  6. }

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

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

Java代码  
  1. public  String getIpAddr(HttpServletRequest request)  {
  2. String ip  =  request.getHeader( " x-forwarded-for " );
  3. if (ip  ==   null   ||  ip.length()  ==   0   ||   " unknown " .equalsIgnoreCase(ip))  {
  4. ip  =  request.getHeader( " Proxy-Client-IP " );
  5. }
  6. if (ip  ==   null   ||  ip.length()  ==   0   ||   " unknown " .equalsIgnoreCase(ip))  {
  7. ip  =  request.getHeader( " WL-Proxy-Client-IP " );
  8. }
  9. if (ip  ==   null   ||  ip.length()  ==   0   ||   " unknown " .equalsIgnoreCase(ip))  {
  10. ip  =  request.getRemoteAddr();
  11. }
  12. return  ip;
  13. }

可是,如果通过了多级反向代理的话,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

说明:按这种方法不一定100%准,网上很多人提到要准确的话必须做一个客户端空间,如applet。

<script type="text/javascript"></script>

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squi...相关推荐

  1. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

  2. 获取客户端的IP地址

    #region public static string GetClientIP() 获取客户端的IP地址/// <summary>/// 获取客户端的IP地址/// </summa ...

  3. 使用JS获取客户端的IP地址

    使用JS获取客户端的IP地址 搜狐IP地址查询接口(可设置编码):https://pv.sohu.com/cityjson?ie=utf-8 简单使用: <script src="ht ...

  4. php如何获取客户端请求ip地址的方法

    php如何获取客户端请求ip地址的方法 获取客户端ip地址的函数 获取客户端ip地址的函数 function getip(){$ip = false;if (!empty($_SERVER[" ...

  5. java获取客户端的IP地址工具类

    java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...

  6. PHP获取客户端真实IP地址的方法

    php获取客户端IP地址有四种方法,这五种方法分别为 1 2 3 4 REMOTE_ADDR HTTP_CLIENT_IP HTTP_X_FORWARDED_FOR HTTP_VIA REMOTE_A ...

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

    这几天搞了用java获取ip地址,由于测试方法不对,一直没有成功,昨天终于想通了并不是方法不对,而是我的测试方法不对,下面这个方法,完全可以得到客户端的公网ip地址 但是在测试的时候注意:我用的是we ...

  8. asp.net如何获取客户端真实IP地址

    目前网上流行的所谓"取真实IP地址"的方法,都有bug,没有考虑到多层透明代理的情况. 多数代码类似: string IpAddress = (HttpContext.Curren ...

  9. 如何使用JavaScript获取客户端的IP地址?

    我需要以某种方式使用JavaScript检索客户端的IP地址: 没有服务器端代码,甚至没有SSI. 但是,我不反对使用免费的第三方脚本/服务. #1楼 在您的页面中包含以下代码: <script ...

最新文章

  1. ASP.NET MVC 重点教程一周年版 第九回 HtmlHelper 【转】
  2. 中序非递归遍历二叉树
  3. Oracle Goldengate OGG 11g与各操作系统及数据库版本的兼容列表
  4. time模块 random模块
  5. mysql 优化设计库_数据库优化设计与SQL优化
  6. POJ1611-嫌犯【图论,并查集】
  7. 电脑小写字母怎么切换_苹果电脑双系统如何切换?苹果电脑双系统切换方法
  8. 初识C语言学习笔记 入门
  9. 每日英语Daily English
  10. 汇编学习软件推荐 - 汇编金手指
  11. mysql将毫秒转换为小时_将毫秒转换为天小时分钟
  12. 多线程_线程插队_join()方法与锁的释放
  13. Android学习日记(yzy):显示application并调用
  14. 机器学习分类光谱数据
  15. Windows下DOS窗口修改编码
  16. 去跨国公司还是去创业公司?
  17. 微信企业号用户验证php,身份验证
  18. sanic入门(一)
  19. 以下python注释代码中_以下Python注释代码,不正确的是()_学小易找答案
  20. 轻松进行SOLIDWORKS基础绘图

热门文章

  1. python怎么分行读取txt文件_python怎么读取txt文件内容
  2. 教你如何识别DWG文件版本
  3. 纯css实现坤坤经典动作-“铁山靠”
  4. javaScript能做什么
  5. 深度学习-MTCNN网络结构详解
  6. 学习scala-hello-world!
  7. 科研快报 | 三代测序技术-海水微生物态,助力海水微生态及微生物基因组研究
  8. 苹果交管局反馈信曝光 首次官方披露自动驾驶相关计划
  9. Masonry介绍与使用实践:快速上手Autolayout
  10. Think PHP crud,ThinkPHP教程_PHP框架之ThinkPHP(八)【CRUD與連貫操作】