第1章 前提知识
1.1 x-forwarded-for,X-Real-IP,getRemoteAddr()区别
-
x-forwarded-for : 是一层层代理记录
-
X-Real-IP :获取最外层ip,即客户的真实ip
为了让服务器能得到客户端的ip,可以在nginx中做些赋值操作:proxy_set_header X-real-ip $remote_addr;
- 注意 :但是如果客户端使用正向代理,则是获取不到。
即在请求头部放入真实ip
3. getRemoteAddr():如果中间有反向代理服务器,web服务器拿的方向代理的ip,反向代理服务器拿的是客户真实ip地址。
1.2 代码示例
1 public static String getIp2(HttpServletRequest request) {
2 String ip = request.getHeader("X-Forwarded-For");
3 if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
4 //多次反向代理后会有多个ip值,第一个ip才是真实ip
5 int index = ip.indexOf(",");
6 if(index != -1){
7 return ip.substring(0,index);
8 }else{
9 return ip;
10 }
11 }
12 ip = request.getHeader("X-Real-IP");
13 if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
14 return ip;
15 }
16 return request.getRemoteAddr();
17 }
用redis实现如下方法:
public Boolean isVisit(String ip){
Long count = redisCountRepository.getx(ip);
if(null == count){
redisCountRepository.incr(ip);
}else if(100L == count){
return false;
}else{
redisCountRepository.incr(ip);
}
return true;
}