package com.terra.proxy.intercepter; import cn.hutool.core.collection.CollectionUtil; import com.terra.proxy.bean.BlackRule; import com.terra.proxy.bean.VistorBean; import com.terra.proxy.mapper.LogMapper; import com.terra.proxy.mapper.ServiceMapper; import com.terra.proxy.service.LogService; import com.terra.proxy.service.ServerRegisterService; import com.terra.proxy.util.JedisUtils; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.HttpRequestInterceptor; import org.apache.http.protocol.HttpContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import redis.clients.jedis.Jedis; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.*; public class ServletInterceptor implements HandlerInterceptor { @Autowired private LogMapper logMapper; @Autowired private ServiceMapper serviceMapper; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request != null) { //获取访问IP String remoteAddr = request.getRemoteAddr(); HashMap param = new HashMap<>(); param.put("status","1"); param.put("limit",5); param.put("page", 0); param.put("ip",remoteAddr); List vistorBeans = logMapper.queryBlackLists(param); if(CollectionUtil.isNotEmpty(vistorBeans)) return false; //先判断redis中是否存在 不存在则加入reids中计数,存在则判断是否超出限制,若无则计数+1,若超出则加入黑名单 Jedis jedis = JedisUtils.getJedis(); String visitCountStr = jedis.get(remoteAddr); BlackRule blackRule = logMapper.selectBlackRule(); if(blackRule==null) return false; 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)zyid = splitpath[1]; } 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 = serviceMapper.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"); logMapper.saveBlackLog(vb); return false; } else { jedis.setrange(remoteAddr, 0, String.valueOf(visitCount + 1)); } } } return true; } public static boolean isdigit(String str) { return str.matches("[0-9]+"); } }