zj
2024-06-03 3603ecb207f7e712c635f19531e05fac4d19e53f
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package project.ddos.internal;
 
import java.util.Date;
import java.util.List;
 
import org.springframework.jdbc.core.JdbcTemplate;
 
import kernel.bo.RecordObjectMapper;
import kernel.util.DateUtils;
import kernel.web.ApplicationUtil;
import project.ddos.DdosRedisKeys;
import project.ddos.IpMenuService;
import project.ddos.model.IpMenu;
import project.ddos.utils.BlacklistIpSerivceTimeWindow;
import project.ddos.utils.LocklistIpSerivceTimeWindow;
import project.redis.RedisHandler;
 
/**
 * @author JORGE
 * @description IP黑白名单服务
 */
public class IpMenuServiceImpl implements IpMenuService {
    
    private RedisHandler redisHandler;
    
    private JdbcTemplate jdbcTemplate;
    
    private LocklistIpSerivceTimeWindow locklistIpSerivceTimeWindow;
    
    private BlacklistIpSerivceTimeWindow blacklistIpSerivceTimeWindow;
    
    public void init() {
        List<IpMenu> list = jdbcTemplate.query("SELECT * FROM T_IP_MENU WHERE DELETE_STATUS=0",RecordObjectMapper.newInstance(IpMenu.class));
        for (IpMenu ipMenu : list) {
            if (DateUtils.addHour(ipMenu.getLast_opera_time(), 24).after(new Date())) { // 黑名单 时间+1天>现在
                switch (ipMenu.getType()) {
                case IpMenu.IP_BLACK:
                    blacklistIpSerivceTimeWindow.putBlackIp(ipMenu.getIp(), ipMenu.getIp());
                    break;
                case IpMenu.IP_LOCK:
                    locklistIpSerivceTimeWindow.putLockIp(ipMenu.getIp(), ipMenu.getIp());
                    break;
                }
            } else {
                ipMenu.setDelete_status(-1);
                checkTimeWindows(ipMenu);
                jdbcTemplate.update("UPDATE T_IP_MENU SET DELETE_STATUS=-1 WHERE UUID='"+ipMenu.getId().toString()+"'");
                redisHandler.setSync(DdosRedisKeys.IP_MENU_IP + ipMenu.getIp(), ipMenu);
            }
        }
    }
 
    @Override
    public void save(IpMenu entity) {
        if(null==entity) return;
        checkTimeWindows(entity);
        if(null==entity.getId()) entity.setId(ApplicationUtil.getCurrentTimeUUID());
        
        ApplicationUtil.executeInsert(entity);
        redisHandler.setSync(DdosRedisKeys.IP_MENU_IP + entity.getIp(), entity);
    }
 
    @Override
    public void update(IpMenu entity) {
        if(null==entity) return;
        checkTimeWindows(entity);
        
        ApplicationUtil.executeUpdate(entity, "WHERE UUID=?", new Object[] {entity.getId()});
        redisHandler.setSync(DdosRedisKeys.IP_MENU_IP + entity.getIp(), entity);
    }
 
    @Override
    public void delete(IpMenu entity) {
        if(null==entity) return;
        
        ApplicationUtil.executeDelete(IpMenu.class, "WHERE UUID=?", new Object[] {entity.getId()});
        redisHandler.remove(entity.getIp());
    }
 
    @Override
    public IpMenu cacheByIp(String ip) {
        return (IpMenu) redisHandler.get(DdosRedisKeys.IP_MENU_IP + ip);
    }
 
    /**
     * 新增ip到白名单
     * @param ip
     */
    public void saveIpMenuWhite(String ip) {
        IpMenu ipMenu = this.cacheByIp(ip);
        if (null == ipMenu) {
            ipMenu = new IpMenu();
            ipMenu.setCreate_time(new Date());
            ipMenu.setDelete_status(0);
            ipMenu.setLast_opera_time(new Date());
            ipMenu.setType(IpMenu.IP_WHITE);
            ipMenu.setIp(ip);
            this.save(ipMenu);
        } else if (ipMenu.getDelete_status() == -1 || !IpMenu.IP_WHITE.equals(ipMenu.getType())) {// 名单被删除或者不是白名单
            ipMenu.setDelete_status(0);
            ipMenu.setLast_opera_time(new Date());
            ipMenu.setType(IpMenu.IP_WHITE);
            this.update(ipMenu);
        }
    }
 
    public void checkTimeWindows(IpMenu entity) {
        if (entity.getDelete_status() == -1) {
            blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp());
            locklistIpSerivceTimeWindow.delLockIp(entity.getIp());
            return;
        }
 
        switch (entity.getType()) {
        case IpMenu.IP_WHITE:
            if (blacklistIpSerivceTimeWindow.getBlackIp(entity.getIp()) != null) {// 白名单直接删除黑名单缓存
                blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp());
            }
            if (locklistIpSerivceTimeWindow.getLockIp(entity.getIp()) != null) {// 白名单直接删除锁定名单缓存
                locklistIpSerivceTimeWindow.delLockIp(entity.getIp());
            }
            break;
        case IpMenu.IP_BLACK:
            if (locklistIpSerivceTimeWindow.getLockIp(entity.getIp()) != null) {// 删除锁定名单缓存
                locklistIpSerivceTimeWindow.delLockIp(entity.getIp());
            }
            blacklistIpSerivceTimeWindow.putBlackIp(entity.getIp(), entity.getIp());
            break;
        case IpMenu.IP_LOCK:
            if (blacklistIpSerivceTimeWindow.getBlackIp(entity.getIp()) != null) {// 删除黑名单缓存
                blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp());
            }
            locklistIpSerivceTimeWindow.putLockIp(entity.getIp(), entity.getIp());
            break;
        }
    }
 
    public void setRedisHandler(RedisHandler redisHandler) {
        this.redisHandler = redisHandler;
    }
 
    public void setBlacklistIpSerivceTimeWindow(BlacklistIpSerivceTimeWindow blacklistIpSerivceTimeWindow) {
        this.blacklistIpSerivceTimeWindow = blacklistIpSerivceTimeWindow;
    }
 
    public void setLocklistIpSerivceTimeWindow(LocklistIpSerivceTimeWindow locklistIpSerivceTimeWindow) {
        this.locklistIpSerivceTimeWindow = locklistIpSerivceTimeWindow;
    }
 
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}