通过配置nginx的proxy_set_header解决无法正确获取客户端访问ip地址总显示127.0.0.1
文章目录
[隐藏]
- 一、前言
- 二、解决方法
- 三、黑名单代码分享
一、前言
为了防止本站资源(小木人印象www.xwood.net)被恶意下载,最近实现安全控制模块-通过分析用户访问IP地址在有效时间内的对本站资源合理下载量,作为黑名单规则,但是发现获取通过之前HttpClientIpUtils工具类获取的ip地址都是127.0.0.1,无法获取终端访问用户有效的ip地址,导致黑名单库无法创建。
二、解决方法
由于nginx配置服务端的反向代理导致,之前反向配置如下
location ^~/open-api/{ proxy_pass http://127.0.0.1:8080/openapi/; }
应该调整配置为如下(增加配置项proxy_set_header x-forwarded-for $remote_addr;)
location ^~/open-api/{ proxy_pass http://127.0.0.1:8080/openapi/; proxy_set_header x-forwarded-for $remote_addr; }
三、黑名单代码分享
1、访问客户端安全控制类ClientUserController,代码如下
public class ClientUserController { private static final Logger logger = Logger.getLogger(ClientUserController.class); private static ConcurrentMap<String,ClientUser> downloadUsers=new ConcurrentHashMap<String,ClientUser>(); private static List<String> blackIplist=new CopyOnWriteArrayList<String>(); //12小时最大下载量 private static int maxDayDownloadTimes=1000; //验证期限 private static long validTimeSec=12*60*60; public static void register(String ip){ if(StringUtils.isEmpty(ip)||"127.0.0.1".equalsIgnoreCase(ip)) return ; if(!isPermission(ip)) return ; if(downloadUsers.containsKey(ip)){ downloadUsers.get(ip).setDownloadTimes(downloadUsers.get(ip).getDownloadTimes()+1); logger.info(" downloadUser login --------------:"+ip+" times----------------:"+downloadUsers.get(ip).toString()); }else{ downloadUsers.put(ip,new ClientUser(ip)); logger.info(" New downloadUser register --------------:"+ip+" times----------------:1"); } } public static boolean isPermission(String ip){ if(StringUtils.isEmpty(ip)){ logger.info(" downloadUser isPermission false,becase you have't clientIp <<<<<<<<<<<<<<<<<<<<<<<< "); return false; } if("127.0.0.1".equalsIgnoreCase(ip)){ logger.info(" downloadUser can't get ip ; ======================================== 127.0.0.1 "); return true; } if(blackIplist.contains(ip)){ logger.info(" downloadUser@"+ip+"@ is danger downloadUser !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ is danger downloadUser !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ is danger downloadUser !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); return false; } if(downloadUsers.containsKey(ip)){ ClientUser checkClientUser=downloadUsers.get(ip); if(System.currentTimeMillis()-checkClientUser.getLastTime()>=validTimeSec){ if(checkClientUser.getDownloadTimes()>=maxDayDownloadTimes){ blackIplist.add(ip); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); return false; }else{ downloadUsers.remove(ip); } }else{ if(checkClientUser.getDownloadTimes()>=maxDayDownloadTimes){ blackIplist.add(ip); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); logger.info(" downloadUser@"+ip+"@ add to blacklist !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! "); return false; } } } return true; } }
2、客户端用户类ClientUser,代码如下
public class ClientUser { private String ip; private Integer downloadTimes=1; private Long lastTime; public ClientUser() { super(); lastTime=System.currentTimeMillis(); } public ClientUser(String ip) { super(); this.ip = ip; lastTime=System.currentTimeMillis(); } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Integer getDownloadTimes() { return downloadTimes; } public void setDownloadTimes(Integer downloadTimes) { this.downloadTimes = downloadTimes; } public Long getLastTime() { return lastTime; } public void setLastTime(Long lastTime) { this.lastTime = lastTime; } public static void main(String[] args) throws Exception{ ClientUser u=new ClientUser(); u.lastTime=System.currentTimeMillis(); Thread.sleep(2000); System.out.println((System.currentTimeMillis()-u.lastTime)/1000); } @Override public String toString() { return "ClientUser [ip=" + ip + "]"; } @Override public boolean equals(Object obj) { ClientUser _this=(ClientUser)obj; if(_this==null) return false; if(this.getIp().equalsIgnoreCase(_this.getIp())) return true; return false; } }
原文出处:xwood -> http://www.xwood.net/_site_domain_/_root/5870/5874/t_c268346.html
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。