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<String, Object> param = new HashMap<>();
|
param.put("status","1");
|
param.put("limit",5);
|
param.put("page", 0);
|
param.put("ip",remoteAddr);
|
List<VistorBean> 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<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)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]+");
|
}
|
|
|
|
}
|