同一IPの一定期間のアクセス数を制限する

1318 ワード

この方式は簡単で乱暴です...プロジェクトの中でメールを送る機能があって、ウェブサイトがユーザーに暴露する1つのフィードバックの意見のメールの入り口で、redisあるいは漏斗あるいは平滑な限流を使わないためです.単純で乱暴な限流であり、実際の状況に応じて使用する.
private CopyOnWriteArrayList> ipList = new CopyOnWriteArrayList<>();

@RequestMapping(value = "/sendMsg.jspx")
	public void sendMsg(HttpServletRequest request,HttpServletResponse response) throws JSONException {
		try {
			//      
			String userIp = request.getRemoteAddr();
			ConcurrentHashMap ipMap = new ConcurrentHashMap<>();
			if(ipList!=null && !ipList.isEmpty()){
				for(ConcurrentHashMap myMap : ipList) {
					if(myMap.get(userIp) != null) {
						//  IP 3        
						if(System.currentTimeMillis() - myMap.get(userIp) < 3 * 1000){
							myMap.put(userIp,System.currentTimeMillis());
							ResponseUtils.renderJson(response, "      !");
						}
					}
				}
				if(ipList.size()==10) {
					//  10        
					ipList.clear();
				}
			}
			ipMap.put(userIp,System.currentTimeMillis());
			ipList.add(ipMap);
			//   --    
			sendEmail.sendEmil();
			ResponseUtils.renderJson(response, "    !");
		} catch (NumberFormatException e) {
			ResponseUtils.renderJson(response, "    !");
			e.printStackTrace();
		}
	}