在写服务端代码时,有时需要对客户端ip做认证,比如限制只有某些ip能访问,或者1个ip1天只能访问几次。最近就碰到个需要限制ip的情况,从网上找了一些服务器获取客户端ip的方法,说的都不太完善,这里整理一下。

获取客户端ip其实就是从request中取,从header取或者直接request.getRemoteAddr()。

public static String getRemoteIpAddr() {
HttpServletRequest request = getRequest();
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();
}
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}
else
{
return ip;
}
}
public static HttpServletRequest getRequest() {
return ServletActionContext.getRequest();
}

如果使用了反向代理软件,将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地址和原来客户端请求的服务器地址。

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

参考原文地址:

http://blog.sina.com.cn/s/blog_a0949eec01013uxg.html

http://blog.csdn.net/songylwq/article/details/7701718

最新文章

  1. Java注解基础概念总结
  2. QQ空间HD(4)-设置左侧菜单栏属性
  3. 浅谈VC++中预编译的头文件放那里的问题分析
  4. 简单的php性能注意点
  5. [未完成]WebService学习第一天学习笔记
  6. r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?
  7. SQL Server 阻塞排除的 2 方法
  8. 谷歌page speed 安装使用及页面问题详解
  9. PHP大小写问题
  10. PHP和Go中的闭包变量作用域
  11. analysed of J-SON/XML processing model Extend to java design model (J-SON/XML处理模型分析 扩展到Java设计模型 )
  12. Ubuntu系统下Anaconda使用方法总结
  13. unity(2017.3) C# 常用API
  14. NAT转换、VLAN与Trunk(特典:ACL初步)
  15. el-table复选框分页记忆
  16. ethereum/EIPs-607 Hardfork Meta: Spurious Dragon硬分叉相关
  17. zabbix监控nginx连接数量
  18. XenServer修改DNS
  19. USB学习笔记连载(十二):USB描述符
  20. Echarts使用小结

热门文章

  1. [算法] trie树实现
  2. Unity3d/2d手机游戏开发第二版 (金玺曾) 随书资源
  3. 简单制作 OS X Yosemite 10.10 正式版U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  4. hibernate的优化
  5. MRC的下setter访问器的两种形式
  6. PHP 多线程、多进程
  7. java之常用正则表达式
  8. linux ssl 双向认证
  9. LPC1788定时器使用
  10. 《玩转Bootstrap(基础)》笔记