1. 程式人生 > >java 實現IP訪問量控制

java 實現IP訪問量控制

同一個IP 訪問網站, 不能同時超過配置的最大值, 可以用來保護REST IP 或者DOS攻擊

Java程式碼  收藏程式碼
  1. /* 
  2.  * Pprun's Public Domain. 
  3.  */  
  4. package org.pprun.common.security;  
  5. import java.io.IOException;  
  6. import java.util.Collections;  
  7. import java.util.HashMap;  
  8. import java.util.HashSet;  
  9. import java.util.Map;  
  10. import java.util.Set;  
  11. import javax.servlet.Filter;  
  12. import javax.servlet.FilterChain;  
  13. import javax.servlet.FilterConfig;  
  14. import javax.servlet.ServletException;  
  15. import javax.servlet.ServletRequest;  
  16. import javax.servlet.ServletResponse;  
  17. import javax.servlet.http.HttpServletResponse;  
  18. import org.slf4j.Logger;  
  19. import org.slf4j.LoggerFactory;  
  20. import org.springframework.beans.factory.annotation.Required;  
  21. import org.springframework.jmx.export.annotation.ManagedAttribute;  
  22. import org.springframework.scheduling.annotation.Scheduled;  
  23. /** 
  24.  * A filter to throttle only a limited number of requests from the same ip per second.
     
  25.  * <p> 
  26.  * Two parameters need to inject: 
  27.  * <ol> 
  28.  * <li>common.throttle.maxConcurrentRequests=10</li> 
  29.  * <li>common.throttle.period=1000</li> 
  30.  * </ol> 
  31.  * <br /> 
  32.  * If you use {@literal Spring} for {@lit DI}, it can be done as below in application {@literal web.xml}: 
  33.  * <br /> 
  34.  * {@code  
  35.  *      <filter>   
  36.  *          <description>A filter to throttle only a limited number of requests from the same ip per second.</description>   
  37.  *          <filter-name>throttleFilter</filter-name>   
  38.  *          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>   
  39.  *      </filter> 
  40.  * } 
  41.  * <br /> 
  42.  * And a bean with {@code id="throttleFilter"} should be defined in {@literal application.xml}. 
  43.  * </p> 
  44.  * @author <a href="mailto:[email protected]">pizhigang</a> 
  45.  */  
  46. //@Component  
  47. public class ThrottleFilter implements Filter, ThrottleFilterMXBean {  
  48.     private static Logger log = LoggerFactory.getLogger(ThrottleFilter.class);  
  49.     // map(ip, requestCount)  
  50.     private Map<String, Integer> ip2countCache = new HashMap<String, Integer>();  
  51.     private Set<String> blackList = new HashSet<String>();  
  52.     private int maxConcurrentRequests;  
  53.     private static final long PERIOD = 1L; // second  
  54.     private boolean enable = false;  
  55.     @Override  
  56.     public void init(FilterConfig config) throws ServletException {  
  57.         // nothing  
  58.     }  
  59.     @Override  
  60.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain nextFilter) throws ServletException, IOException {  
  61.         if (enable) {  
  62.             final String ip = request.getRemoteAddr();  
  63.             boolean isOverflow;  
  64.             synchronized (this) {  
  65.                 Integer count = ip2countCache.get(ip);  
  66.                 if (count == null || count.intValue() == 0) {  
  67.                     count = 0;  
  68.                 }  
  69.                 if (count < maxConcurrentRequests) {  
  70.                     isOverflow = false;  
  71.                     ip2countCache.put(ip, count + 1);  
  72.                 } else {  
  73.                     isOverflow = true;  
  74.                     blackList.add(ip);  
  75.                 }  
  76.             }  
  77.             if (isOverflow) {  
  78.                 // block it  
  79.                 log.info(" ip {} has reached the threshold {} in {} second, block it!"new Object[]{ip, maxConcurrentRequests, PERIOD});  
  80.                 if (response instanceof HttpServletResponse) {  
  81.                     ((HttpServletResponse) response).sendError(503, ip + " has too many concurrent requests per " + PERIOD + " second");  
  82.                 }  
  83.                 return;  
  84.             }  
  85.         } // else go ahead below  
  86.         // every thing is okay, go ahead  
  87.         nextFilter.doFilter(request, response);  
  88.     }  
  89.     // every 1 second  
  90.     @Scheduled(fixedRate = PERIOD * 1000)  
  91.     public void throttlingJob() {  
  92.         if (enable) {  
  93.             log.debug("Throttle Filter clean up job is running");  
  94.             synchronized (ThrottleFilter.this) {  
  95.                 for (Map.Entry<String, Integer> ip2count : ip2countCache.entrySet()) {  
  96.                     Integer count = ip2count.getValue();  
  97.                     String ip = ip2count.getKey();  
  98.                     if (count == null || count <= 1) {  
  99.                         ip2countCache.remove(ip);  
  100.                     } else {  
  101.                         if (count == maxConcurrentRequests) {  
  102.                             // remove from blacklist  
  103.                             log.info("Throttle Filter: removing {} from black list", ip);  
  104.                             blackList.remove(ip);  
  105.                         }  
  106.                         ip2countCache.put(ip, count - 1);  
  107.                     }  
  108.                 }  
  109.             }  
  110.             log.debug("Throttle Filter clean up job is done");  
  111.         }  
  112.     }  
  113.     /** 
  114.      * Any cleanup for the filter. 
  115.      */  
  116.     @Override  
  117.     public void destroy() {  
  118.         log.warn("destorying Throttle Filter");  
  119.     }  
  120.     /** 
  121.      * Sets the maximum number of concurrent requests for a single IP. 
  122.      */  
  123.     @Required  
  124.     public void setMaxConcurrentRequests(int max) {  
  125.         maxConcurrentRequests = max;  
  126.     }  
  127.     @ManagedAttribute(description = "is the throttle filter enable or not")  
  128.     @Override  
  129.     public boolean isEnable() {  
  130.         return enable;  
  131.     }  
  132.     @Required  
  133.     @Override  
  134.     public void setEnable(boolean enable) {  
  135.         log.info("set enable to {}", enable);  
  136.         if (enable == false) {  
  137.             log.info("Throttle filter will be disabled");  
  138.         }  
  139.         this.enable = enable;  
  140.     }  
  141.     public Set<String> getBlackList() {  
  142.         // for exactly, it might need synchronized, but no hurt for snapshoot in one or severl seconds  
  143.         return Collections.unmodifiableSet(blackList);  
  144.     }  
  145. }  

相關推薦

java 實現IP訪問量控制

同一個IP 訪問網站, 不能同時超過配置的最大值, 可以用來保護REST IP 或者DOS攻擊 Java程式碼   /*   * Pprun's Public Domain.   */   package org.pprun.common.security;  

Java實現IP/TCP通信幫助類SocketSimple

[] ofo create tar 中央倉庫 thread get 講解 llb 新春伊始,上班碼代碼,看了一下自己年前的總結,發現有一個Socket通信的幫助庫SocketSimple,今天就介紹一下該庫的作用。 作用講解 SocketSimple庫主要是對Socket服

Java 實現系統許可權控制思路

首先介紹下思路: 1、使用者表 user; 2、角色表 role; 3、選單 menu; 4、角色選單許可權表 role_menu; 5、使用者選單許可權表 user_menu; 如圖: 根據使用者角色取出該角色所有許可權,並對使用者進行許可權分配;注意選單的按鈕(新

基於java過濾器實現web系統的IP訪問控制

一.使用場景   一般情況下,我們設計web系統都會分別設計前臺和後臺,前臺供普通使用者訪問,給普通使用者提供服務.然後後臺給系統管理員使用,用於管理維護前臺的資料,以及對一些環境的引數配置.對於後臺管理一般都是隻給公司內部的員工進行訪問,所以我們一般要通過IP來限制訪問,

MQTT是IBM開發的一個即時通訊協議,構建於TCP/IP協議上,是物聯網IoT的訂閱協議,借助消息推送功能,可以更好地實現遠程控制

集合 cap 消息處理 簡易 遠程控制 mes ogr 設計思想 成本 最近一直做物聯網方面的開發,以下內容關於使用MQTT過程中遇到問題的記錄以及需要掌握的機制原理,主要講解理論。 背景 MQTT是IBM開發的一個即時通訊協議。MQTT構建於TCP/IP協議上

Java TCP/IP Socket程式設計】----深入剖析----TCP資料傳輸底層實現

目錄   套接字底層資料結構 TCP資料傳輸底層實現 案例 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 套接字底層資料結構     要熟悉掌握網路程式設計,就需要理解套接字的具體實現所關聯的資料結構和底

Java實現HadoopHA叢集的hdfs控制

一、HadoopHA的搭建:https://www.cnblogs.com/null-/p/10000309.html     二、pom檔案依賴: <dependencies> <dependency> &

8皇后以及N皇后演算法探究,回溯演算法的JAVA實現,非遞迴,迴圈控制及其優化

研究了遞迴方法實現回溯,解決N皇后問題,下面我們來探討一下非遞迴方案 實驗結果令人還是有些失望,原來非遞迴方案的效能並不比遞迴方案效能高 程式碼如下: package com.newflypig.eightqueen; import java.util.Date; /**

springboot實現java代理IP池 Proxy Pool,提供可用率達到95%以上的代理IP

一、背景 前段時間,寫java爬蟲來爬網易雲音樂的評論。不料,爬了一段時間後ip被封禁了。由此,想到了使用ip代理,但是找了很多的ip代理網站,很少有可以用的代理ip。於是,抱著邊學習的心態,自己開發了一個代理ip池。 二、相關技術及環境 技術: SpringBoot,SpringMVC, Hiberna

Java TCP/IP Socket】深入剖析socket——資料傳輸的底層實現

    底層資料結構     如果不理解套接字的具體實現所關聯的資料結構和底層協議的工作細節,就很難抓住網路程式設計的精妙之處,對於TCP套接字來說,更是如此。套接字所關聯的底層的資料結構集包含了

【119】用Java實現TCP協議的IP地址和埠號的轉發功能

最近碰到了這樣的需求:使用者通過TCP訪問伺服器 A,伺服器 A 再把 TCP 請求轉發給伺服器 B;同時伺服器 A 把伺服器 B 返回的資料,轉發給使用者。也就是伺服器 A 作為中轉站,在使用者和伺服器 B 之間轉發資料。示意圖如下: 為了滿足這個需求,

Java實現根據網址,解析埠號、ip、host

package test.ping; import java.io.IOException; import java.net.InetAddress; import java.net.URL; public class TestGetIp { public static void

java實現流量控制

java實現流量控制 有些時候我們的服務負載有限,這時候就需要限制對其的併發訪問,常見的應用場景是開放api。下面介紹兩種流量控制的方式。 1.訊號量semaphore 一個計數訊號量。從概念上講,訊號量維護了一個許可集。如有必要,在許可可用前會阻塞每一個 acquire()

java實現控制小球的移動(監聽機制)

效果圖如下:  通過上下左右來控制小球的移動 ,用到監聽機制,如果監聽機制不知道的話,可以看看這篇部落格https://blog.csdn.net/doubleguy/article/details/85198107 完整程式碼如下: package node; i

Java TCP/IP Socket——深入剖析socket—資料傳輸的底層實現

本文轉自:http://blog.csdn.net/ns_code/article/details/15813809 底層資料結構 如果不理解套接字的具體實現所關聯的資料結構和底層協議的工作細節,就很難抓住網路程式設計的精妙之處,對於TCP套接字來說,更是如此。套接

java 通過map實現循環控制

cycle ons eat hash shm java 頻繁 general create public Object cycle(){ private Map<String, Long> userTicks = new HashMap<String, L

Java實現:月,日,年,周,訪問量統計

一:工程截圖: 二:執行效果圖: 三:CountObjectInfo.java: package cn.csrc.base.count; import java.util.Date; public class CountObjectInfo { // 總訪問量

Java實現代理ip訪問網路的實現方式之Java實現切換ip訪問網路資源

用程式實現代理ip訪問網路資源是大家比較常用的一個功能,今天就來看一下如何用Java實現ip的切換代理訪問網路資源,廢話不多說,下面直接上程式碼: package ip_daili; import java.io.BufferedReader; import java.io

Android使用webview控制元件載入本地html,通過Js與後臺Java實現資料的傳遞

1.在佈局檔案中加WebView控制元件,在java中獲取WebView物件。 2.載入本地html檔案。 3.開啟js功能。         webView.getSettings().setJa

各個ip地址庫對比與java實現

1.    產品篇 1.  ipip.net 優勢:支援離線下載,資料更新頻繁,資料精確 劣勢:收費如下,收費的才有經緯度 2.Max Mind 優勢:支援離線下載,資料如果是收費版的更新頻繁,資料精確,有大致經緯度            Maxmind更像是一個