博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java服务器获取客户端ip
阅读量:6581 次
发布时间:2019-06-24

本文共 1493 字,大约阅读时间需要 4 分钟。

在写服务端代码时,有时需要对客户端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(); }

如果使用了反向代理软件,将 的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

转载于:https://www.cnblogs.com/chenjack/p/6298215.html

你可能感兴趣的文章
PreparedStatement vs Statement
查看>>
使用texturePaker批量转化pvr为pn
查看>>
自我介绍
查看>>
洛谷[P1002]过河卒
查看>>
截取指定网站Html编码
查看>>
Symfony框架系列----1.入门安装
查看>>
Java陷阱之assert关键字
查看>>
Apache Commons 工具集
查看>>
编程的智慧(转自王垠个人博客)——满满的编程实践经验不看就错过
查看>>
作业一 统计软件简介与数据操作
查看>>
css布局
查看>>
HBase-java api 基本操作
查看>>
23种设计模式之建造者模式
查看>>
计算机网络笔记2:物理层
查看>>
POJ3080-Blue Jeans
查看>>
POJ2229 Sumsets
查看>>
在LINQ-TO-SQL中实现“级联删除”的方法
查看>>
在Oracle Form中,如何实现自动编号(行号)的功能
查看>>
xcode7中搭建python开发环境
查看>>
java设计模式-建造者模式
查看>>