package com.terra.proxy.util; import cn.hutool.core.collection.CollectionUtil; import com.terra.proxy.bean.BlackRule; import com.terra.proxy.bean.VistorBean; import com.terra.proxy.service.Impl.LogServiceImpl; import com.terra.proxy.service.Impl.ServerRegisterServiceImpl; import org.apache.commons.lang3.StringUtils; import redis.clients.jedis.Jedis; import javax.servlet.http.HttpServletRequest; import java.sql.DriverManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BlackUtils { /** * * @param request * @param logService * @param service * @return true 可以访问 flase 过滤 */ public static Boolean blackInterceptor(HttpServletRequest request, LogServiceImpl logService, ServerRegisterServiceImpl service){ if (request != null) { //获取访问IP String requestURI = request.getRequestURI(); //系统内部接口不拦截 if( requestURI.startsWith("/log")|| requestURI.startsWith("/token")|| requestURI.startsWith("/serv")|| requestURI.startsWith("/serverRegister")|| requestURI.startsWith("/test") ){ return true; } String remoteAddr = request.getRemoteAddr(); HashMap param = new HashMap<>(); param.put("status","3"); //白名单生效 param.put("ip",remoteAddr); //白名单用户不拦截 if(CollectionUtil.isNotEmpty(logService.selectWhiteList(param))) return true; param.put("status","1"); //黑名单生效 List vistorBeans = logService.queryBlackLists(param); if(CollectionUtil.isNotEmpty(vistorBeans)) return false; //先判断redis中是否存在 不存在则加入reids中计数,存在则判断是否超出限制,若无则计数+1,若超出则加入黑名单 Jedis jedis = JedisUtils.getJedis(); String visitCountStr = jedis.get(remoteAddr); BlackRule blackRule = logService.selectBlackRule(); if(blackRule==null) return true; if (StringUtils.isEmpty(visitCountStr)) { //不存在则加入redis中 if(blackRule.getSeltime().equals("m")){ blackRule.setTime(blackRule.getTime()*60); }else if(blackRule.getSeltime().equals("h")){ blackRule.setTime(blackRule.getTime()*3600); } jedis.setex(remoteAddr, blackRule.getTime(), "1"); } else { //已经存在 判断是否大于1000次 是则加入黑名单 否计数+1 Integer visitCount = Integer.valueOf(visitCountStr); if (visitCount >= blackRule.getCount()) { //加入黑名单 表visitlog中status状态为1:黑名单状态 VistorBean vb = new VistorBean(); Map params = new HashMap(); String zyid="0000"; String [] splitpath=null; List serverlist = new ArrayList<>(); vb.setRequestip(request.getRemoteAddr()); String path = request.getPathInfo(); if(StringUtils.isNotEmpty(path)){ splitpath = path.split("/"); if(null!=splitpath && splitpath.length>1){ String numZid = splitpath[1]; if(isdigit(numZid)) zyid=numZid; } } String suffix = null; vb.setResourceid(Integer.valueOf(zyid)); vb.setVisitfromsys("HYJGPT"); if (null!=splitpath&&splitpath.length > 3 && splitpath[3] != null) { suffix = isdigit(splitpath[2]) ? splitpath[2] : null; } params.put("resourceid", Integer.valueOf(zyid)); params.put("suffix", suffix != null ? Integer.valueOf(suffix) : null); params.put("enable", 1); params.put("fromsys", "HYJGPT"); params.put("SERVERURL", "test"); serverlist = service.queryServer(params); if(CollectionUtil.isNotEmpty(serverlist)){ params.put("SERVERURL", serverlist.get(0).get("SERVERURL").toString()); serverlist.add(param); vb.setServerurl(serverlist.get(0).get("SERVERURL").toString()); } vb.setResult("false"); logService.saveBlackLog(vb); //JedisUtils.close(jedis); return false; } else { jedis.setrange(remoteAddr, 0, String.valueOf(visitCount + 1)); } } JedisUtils.close(jedis); } return true; } public static boolean isdigit(String str){ return str.matches("[0-9]+"); } public static void main(String[] args) { } }