程序处理中使用了方法 request.getRemoteAddr() 来获取用户的ip地址,但是这个ip地址容易被欺骗.
并且在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。或者内网服务就在域控机器上,由于安装了域控,拓扑结构发生变化,这时这个方法获取的ip都为服务器自身的ip
解决方式: 用另外的方法可以获取到真正的ip,其实是去发送请求的报文头中的信息:
String s_gethead=request.getHeader("x-forwarded-for");
这时候获取的是一个ip串,类似192.168.1.123, 192.168.1.1,..... 代表的意思是进行了几次转发之后的ip记录.注意,真正的发起ip是第一个不为unknown的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; }