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<String, Object> param = new HashMap<>();
|
param.put("status","3"); //白名单生效
|
param.put("ip",remoteAddr);
|
//白名单用户不拦截
|
if(CollectionUtil.isNotEmpty(logService.selectWhiteList(param))) return true;
|
param.put("status","1"); //黑名单生效
|
List<VistorBean> 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<String, Object> params = new HashMap();
|
String zyid="0000";
|
String [] splitpath=null;
|
List<Map> 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) {
|
|
}
|
}
|