1
13693261870
2022-09-16 fee60c3e25fac0982f3b8cb8feea7225c4ed22f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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) {
 
    }
}