获取客户端真实IP【servlet request getHeader("x-forwarded-for")】

在JSP中,获取客户端IP的方法是request.getRemoteAddr(),这个方法在绝大部分情况下是有效的,但是通过反向代理:如nginx,进行转发时,就不能获取到客户端真实的IP。如果使用了反向代理,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP。

因为通过方向代理,就相当于在客户端和服务器之间加了中间层,因此服务器无法直接拿到客户端的 IP(拿到的是反向代理的IP),服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端 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();
      }
      if((ip != null)&&(ip.length()) > 15){
      	int index = ip.indexOf(",");
      	if(index > 0){
      		ip = ip.substring(0,index);
      	}
      }
      if("0:0:0:0:0:0:0:1".equals(ip)){
      	ip="127.0.0.1";
      }
      return ip;
}

扩展:
IP地址由32位二进制数组成,可分为网络号和主机号两部分。
IP地址通常被分割为4个“8位二进制数”(也就是4个字节)。
IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。例:点分十进IP地址(100.4.5.6),实际上是32位二进制数(01100100.00000100.00000101.00000110)。
Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。其中A、B、C类由InternetNIC在全球范围内统一分配;D、E类为特殊地址。

A类:
最大网络数:126(2^7-2)
IP地址范围:1.0.0.0–127.255.255.255
最大主机数:16777214
私有IP地址范围:10.0.0.0–10.255.255.255
B类:

最大网络数:16384(2^14)
IP地址范围:128.0.0.0–191.255.255.255
最大主机数:65534
私有IP地址范围:172.16.0.0–172.31.255.255

C类:
最大网络数:2097152(2^21)
IP地址范围:192.0.0.0–223.255.255.255
最大主机数:254
私有IP地址范围:192.168.0.0–192.168.255.255

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值