Forráskód Böngészése

全链路:::::ip+黑白名单+访问限制-v0.01

(cherry picked from commit a020067b71568a06a0c2a0a8228f55f5ec1d62ff)
MOKASZ\lw12420 1 éve
szülő
commit
5aa520db79
14 módosított fájl, 281 hozzáadás és 68 törlés
  1. 0 53
      launch-admin/src/main/java/com/webflux/launchadmin/config/LoginWebFiter.java
  2. 3 2
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/listening/ListeningPlanNewOutController.java
  3. 2 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/listening/req/ListeningDataLists.java
  4. 16 2
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewCommonOutController.java
  5. 15 5
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewOutController.java
  6. 1 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/res/DataLists.java
  7. 2 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/res/PlanNewCommonRes.java
  8. 9 2
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/testController.java
  9. 8 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/planNew/WxUrl.java
  10. 186 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/ip/BlacklistService.java
  11. 9 0
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/ip/IpWhite.java
  12. 17 2
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceImpl.java
  13. 2 1
      launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceInterface.java
  14. 11 1
      launch-redis/src/main/java/com/weblux/launchredis/cacheConfig/CacheConfig.java

+ 0 - 53
launch-admin/src/main/java/com/webflux/launchadmin/config/LoginWebFiter.java

@@ -167,62 +167,9 @@ public class LoginWebFiter implements WebFilter {
             response.close();
         }
         return true;
-
     }
 
 
 
 
-//    public static String parseStoreKey(String sessionId) {
-//        if (sessionId != null && sessionId.indexOf("_") > -1) {
-//            String[] sessionIdArr = sessionId.split("_");
-//            if (sessionIdArr.length == 2 && sessionIdArr[0] != null && sessionIdArr[0].trim().length() > 0) {
-//                String userId = sessionIdArr[0].trim();
-//                return userId;
-//            }
-//        }
-//
-//        return null;
-//    }
-//    private static String  xxl0(ServerWebExchange exchange) {
-//
-//        MultiValueMap<String, HttpCookie> cookies = exchange.getRequest().getCookies();
-//        if (!cookies.containsKey("xxl_sso_sessionid")) {
-//            return null;
-//        }
-//        String xxl_sso_sessionid = cookies.get("xxl_sso_sessionid").toString();
-//        if (Objects.isNull(xxl_sso_sessionid)) {
-//            return null;
-//        }
-//        String xxl_sso_sessionid1 = xxl_sso_sessionid.replace("[","");
-//        String xxl_sso_sessionid2 =xxl_sso_sessionid1.replace("]","");
-//
-//        String[] split = xxl_sso_sessionid2.split("=");
-//        if(Objects.isNull(split[1])){
-//            return null;
-//        }
-//        String value = split[1];
-//        String s = parseStoreKey(value);
-//        return redisKey(s);
-//    }
-//    private static String redisKey(String sessionId) {
-//        return "xxl_sso_sessionid".concat("#").concat(sessionId);
-//    }
-//
-//
-//
-//    public Boolean  xxl1(ServerWebExchange exchange){
-//        String key = xxl0(exchange);
-//        if (Objects.isNull(key)) {
-//            return false;
-//        }
-//        Mono<Object> objectMono = reactiveRedisTemplate.opsForValue().get(key);
-//    //    Optional<Object> o = objectMono.blockOptional();
-//        return false;
-//
-//    }
-//
-//    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
-//        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
-//    }
 }

+ 3 - 2
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/listening/ListeningPlanNewOutController.java

@@ -7,6 +7,7 @@ import com.webflux.launchcommon.returnObj.RStatus;
 import jakarta.annotation.Resource;
 import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
 /**
@@ -27,8 +28,8 @@ public class ListeningPlanNewOutController {
      * @return {@link Mono}<{@link RStatus}<{@link ListeningDataLists}>>
      */
     @PostMapping("landingPageList")
-    public Mono<RStatus<ListeningDataLists>> LandingPageList(@RequestBody OutListeningRequest outListeningRequest) {
-      return   listeningPlanService.LandingPageList(outListeningRequest);
+    public Mono<RStatus<ListeningDataLists>> LandingPageList(@RequestBody OutListeningRequest outListeningRequest, ServerWebExchange exchange) {
+      return   listeningPlanService.LandingPageList(outListeningRequest,  exchange);
     }
     /**
      * 长按此处转发

+ 2 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/listening/req/ListeningDataLists.java

@@ -29,6 +29,8 @@ public class ListeningDataLists {
      */
     List<H5ImageAndTextListening> images;
 
+    private String wxUrl;
+
 
 
 }

+ 16 - 2
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewCommonOutController.java

@@ -10,6 +10,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.plumelog.core.util.LogExceptionStackTrace;
 import com.webflux.launchadmin.global.BaseException;
+import com.webflux.launchadmin.mysql.controller.listening.req.ListeningDataLists;
 import com.webflux.launchadmin.mysql.controller.otherServices.res.ByCodeGetImportDomainRes;
 import com.webflux.launchadmin.mysql.controller.planNew.req.*;
 import com.webflux.launchadmin.mysql.controller.planNew.res.*;
@@ -19,6 +20,7 @@ import com.webflux.launchadmin.mysql.entity.groupUsers.GroupUsers;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
 import com.webflux.launchadmin.mysql.entity.sourceMaterial.Album;
+import com.webflux.launchadmin.mysql.service.ip.BlacklistService;
 import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.ipAnalyze.IpAnalyzeServiceInterface;
@@ -32,6 +34,7 @@ import com.webflux.launchcommon.returnObj.RStatus;
 import com.webflux.launchcommon.utils.StringUtils;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
@@ -81,7 +84,8 @@ public class PlanNewCommonOutController {
     private PlanServiceInterface planServiceInterface;
     @Resource
     private MaterialManagementInterface sourceMaterialInterface;
-
+    @Autowired
+    private BlacklistService blacklistService;
 
 
     private static final String COLUMN="id,name,code,type,poster_template_id,group_id,config_json,import_domain,preview_url";
@@ -181,7 +185,17 @@ public class PlanNewCommonOutController {
         });
         // GZIP压缩
        // Mono<byte[]> res = resMono.flatMap(f -> Mono.just(Objects.requireNonNull(this.compressData(JSONUtil.toJsonStr(f)))));
-        return RStatus.success(resMono);
+        Mono<Boolean> rateReturn = blacklistService.getRateReturn(exchange);
+        return rateReturn.flatMap(bl->{
+            if(bl){
+                return  RStatus.success(resMono) ;
+            }else {
+                PlanNewCommonRes dataLists = new PlanNewCommonRes();
+                dataLists.setWxUrl(BlacklistService.wxUrl.get());
+                return RStatus.fail("1","",Mono.just(dataLists));
+            }
+        });
+       // return RStatus.success(resMono);
     }
 
     /**

+ 15 - 5
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/PlanNewOutController.java

@@ -14,6 +14,7 @@ import com.webflux.launchadmin.mysql.controller.planNew.req.*;
 import com.webflux.launchadmin.mysql.controller.planNew.res.*;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
+import com.webflux.launchadmin.mysql.service.ip.BlacklistService;
 import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.ipAnalyze.IpAnalyzeServiceInterface;
@@ -79,6 +80,9 @@ public class PlanNewOutController {
     private ReactiveRedisTemplate<String,String> reactiveRedisTemplate;
 
     @Autowired
+    private BlacklistService blacklistService;
+
+    @Autowired
     private SourceMaterialInterface sourceMaterialInterface;
     //private static final ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<String,Integer>();
 
@@ -485,8 +489,6 @@ public class PlanNewOutController {
             }).switchIfEmpty(Mono.just(getReturnLoop()));
             Mono<List<Ad>> adtop = template.select(Query.query(Criteria.where("type").is(1).and("deleted_at").isNull()).columns("id,name,type,image,show_beg_at,show_end_at,link".split(",")), Ad.class).onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage()+"4"))).collectList();////广告类型1顶部2底部3返回4安卓,ios的返回
             Mono<List<Ad>> bottom = template.select(Query.query(Criteria.where("type").is(2).and("deleted_at").isNull()).columns("id,name,type,image,show_beg_at,show_end_at,link".split(",")), Ad.class).onErrorResume(throwable -> Mono.error(new BaseException(throwable.getMessage()+"5"))).collectList();
-
-
             Mono<DataLists> dataListsMono = Mono.zip(code, listAudio, retAudioId, returnLoop, arrayListMono, adtop, bottom, wx_user_id).flatMap(f -> {
                 DataLists dataLists = new DataLists();
                 dataLists.setPlanNew(f.getT1());
@@ -575,11 +577,19 @@ public class PlanNewOutController {
                 }
                 return Mono.just(dataLists);
             });
-
-
             return dataListsMono;
         });
-        return RStatus.successList(dataListsMono1);
+        Mono<Boolean> rateReturn = blacklistService.getRateReturn(exchange);
+       return rateReturn.flatMap(bl->{
+            if(bl){
+              return  RStatus.successList(dataListsMono1) ;
+            }else {
+                DataLists dataLists = new DataLists();
+                dataLists.setWxUrl(BlacklistService.wxUrl.get());
+                return RStatus.fail("1","",Mono.just(dataLists));
+            }
+        });
+       // return RStatus.successList(dataListsMono1);
     }
 
 

+ 1 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/res/DataLists.java

@@ -59,6 +59,7 @@ public class DataLists {
     private String backgroupDomain;//背景组域名
 
     private String  listButton;
+    private String wxUrl;
 
 
 }

+ 2 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/planNew/res/PlanNewCommonRes.java

@@ -28,4 +28,6 @@ public class PlanNewCommonRes {
     private List<GroupUserRes> groupUserList;
     /** 群信息 */
     private List<H5ImageAndText> groupImageAndTextList;
+
+    private String wxUrl;
 }

+ 9 - 2
launch-admin/src/main/java/com/webflux/launchadmin/mysql/controller/testController.java

@@ -11,6 +11,7 @@ import com.webflux.launchadmin.mysql.entity.planNew.BackgroupImage;
 import com.webflux.launchadmin.mysql.entity.planNew.Image;
 import com.webflux.launchadmin.mysql.entity.test.Tweet;
 import com.webflux.launchadmin.mysql.repository.test.TweetRepository;
+import com.webflux.launchadmin.mysql.service.ip.BlacklistService;
 import com.webflux.launchadmin.mysql.task.SyncImageToRedis;
 import com.webflux.launchadmin.mysql.service.test.TweetService;
 import com.webflux.launchadmin.mysql.task.SyncListeningAudioToRedis;
@@ -35,6 +36,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
 import java.io.IOException;
@@ -61,11 +63,16 @@ public class testController {
     private SyncImageToRedis redis;
     @Resource
     private SyncListeningAudioToRedis redis1;
-
+    @Autowired
+    private BlacklistService blacklistService;
     @Resource
     TweetService tweetService;
 
-
+    @GetMapping("get51")
+    public Mono<Boolean>  get51(ServerWebExchange exchange)   {
+        Mono<Boolean> rateReturn = blacklistService.getRateReturn(exchange);
+        return rateReturn;
+    }
     @GetMapping("get5")
     public Mono<List<ListeningAudio>>  get5()   {
         redis1.syncLinteningAudioPlan();

+ 8 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/entity/planNew/WxUrl.java

@@ -0,0 +1,8 @@
+package com.webflux.launchadmin.mysql.entity.planNew;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+@Table("wx_url")
+public record WxUrl(@Id Long id, String url) {
+}

+ 186 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/ip/BlacklistService.java

@@ -0,0 +1,186 @@
+package com.webflux.launchadmin.mysql.service.ip;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import com.google.common.cache.Cache;
+import com.webflux.launchadmin.mysql.entity.planNew.WxUrl;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.r2dbc.core.R2dbcEntityTemplate;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.relational.core.query.Criteria;
+import org.springframework.data.relational.core.query.Query;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.net.InetSocketAddress;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class BlacklistService {
+    @Resource
+    private ReactiveRedisTemplate<String,String> reactiveRedisTemplate;
+
+    @Resource
+    private R2dbcEntityTemplate template;
+
+    private static final List<String> firstUrl = List.of("out/planNew/hfoInfo","out/planNew/hfoInfo","out/listening/landingPageList");
+    private static  final CopyOnWriteArrayList<String> ip_balck_list = new CopyOnWriteArrayList<>();
+    private static  final CopyOnWriteArrayList<String> ip_white_list = new CopyOnWriteArrayList<>();
+    private static  final  AtomicInteger  ipRateLimitRange= new AtomicInteger();//访问次数
+    private static  final String key="ip_rate_limit:";//为用户ip访问记录次数ip_rate_limit:1.180.116.135
+    public static final AtomicReference<String> wxUrl=new AtomicReference<>();
+
+    /**
+     *
+     * @param exchange
+     * @return
+     */
+    public Mono<Boolean> getRateReturn(ServerWebExchange exchange){
+        ServerHttpRequest httpRequest = exchange.getRequest();
+        InetSocketAddress remoteAddress = httpRequest.getRemoteAddress();
+        String ipAddress;
+        if (remoteAddress != null) {
+            ipAddress = remoteAddress.getAddress().getHostAddress();
+        } else {
+            ipAddress = null;
+        }
+        if (Objects.nonNull(ipAddress)) {
+            try {
+                return getIpRateNum(ipAddress);
+            }catch (Exception e){
+                log.error("ip黑名单验证Error:::"+e.getMessage());
+                return Mono.just(false);
+            }
+        }
+        return Mono.just(false);
+    }
+    /**
+     * 获取ip访问次数
+     */
+    public Mono<Boolean> getIpRateNum(String ip){
+        if (ip_white_list.contains(ip)) {
+            return Mono.just(true);
+        }
+        if (ip_balck_list.contains(ip)) {
+            return Mono.just(false);
+        }
+        String keys=key+ip;
+        long secondsUntilNextMidnight = getSecondsUntilNextMidnight();
+        return reactiveRedisTemplate.opsForValue().get(keys)
+                .switchIfEmpty(Mono.just("0")) //
+                .flatMap(f->{
+                    if(Integer.parseInt(f)==0){
+                        Mono<Long> increment = reactiveRedisTemplate.opsForValue().increment(keys);
+                        Mono<Boolean> expire = reactiveRedisTemplate.expire(keys, Duration.ofMinutes(secondsUntilNextMidnight));
+                        return increment.then(expire).flatMap(tr->Mono.just(true));
+                    }
+                    if (Integer.parseInt(f) > ipRateLimitRange.get()) {
+                        return Mono.just(false);
+                    }
+                    Mono<Long> increment = reactiveRedisTemplate.opsForValue().increment(keys);
+                    return  increment.flatMap(num->{
+                        if (num > ipRateLimitRange.get()) {
+                            return Mono.just(false);
+                        }
+                        return Mono.just(true);
+                    });});
+    }
+    private static long getSecondsUntilNextMidnight() {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime midnight = now.toLocalDate().plusDays(1).atStartOfDay().plusHours(0).plusSeconds(1).plusMinutes(0);
+        long l = Duration.between(now, midnight).toMinutes();
+        return l;
+    }
+
+    @PostConstruct
+    public void postConstruct()  {
+        getIpBalckList();
+        getIpRateLimitRange();
+        getWxUrl();
+    }
+    /**
+     * 获取缓存中设置次数
+     */
+    @Scheduled(fixedDelay = 160000)
+    public void getWxUrl(){
+        template.select(Query.query(Criteria.empty()), WxUrl.class).collectList().flatMap(list->{
+            if (!list.isEmpty()) {
+                list.stream().map(WxUrl::url).findFirst().ifPresent(wxUrl::set);
+            }else {
+                log.error("非异常:::提醒::: ip限制后跳转微信url 未配置");
+            }
+            return Mono.just("");
+        }).subscribe();
+    }
+    /**
+     * 获取缓存中设置次数
+     */
+    @Scheduled(fixedDelay = 160000)
+    public void getIpRateLimitRange(){
+        reactiveRedisTemplate.opsForValue().get("ip_rate_limit_range").flatMap(range->{
+            ipRateLimitRange.set(Integer.parseInt(range));
+            return Mono.just(range);
+        }).subscribe();
+    }
+    /**
+     * 数据源同步本地 黑白名单
+     */
+    @Scheduled(fixedDelay = 160000)
+    public void getIpBalckList(){
+        template.select(Query.query(Criteria.where("status").is(1)), IpWhite.class).collectList().flatMap(ipInfo -> {
+            Map<Integer, List<IpWhite>> collect = ipInfo.stream().filter(f -> Objects.nonNull(f.type())).collect(Collectors.groupingBy(IpWhite::type));
+            List<String> ips = getCollect(collect,1);
+            if(!ips.isEmpty()){
+                List<String> addIps = getAddIps(ips, ip_white_list);
+                if (!addIps.isEmpty()) {
+                    ip_white_list.addAll(addIps);
+                }
+                List<String> removers = getAddIps(ip_white_list, ips);
+                if(!removers.isEmpty()){
+                    ip_white_list.removeAll(removers);
+                }
+            }
+            List<String> ips2 = getCollect(collect,2);
+            if(!ips.isEmpty()){
+                List<String> addIps2 = getAddIps(ips2, ip_balck_list);
+                if (!addIps2.isEmpty()) {
+                    ip_balck_list.addAll(addIps2);
+                }
+                List<String> removers2 = getAddIps(ip_balck_list, ips2);
+                if(!removers2.isEmpty()){
+                    ip_balck_list.removeAll(removers2);
+                }
+            }
+            return Mono.just(ipInfo);
+        }).subscribe();
+    }
+
+
+    @NotNull
+    private List<String> getAddIps(List<String> ips, List<String> ip_white_list) {
+        return ips.stream().filter(o -> !ip_white_list.contains(o)).collect(Collectors.toList());
+    }
+
+    @NotNull
+    private List<String> getCollect(Map<Integer, List<IpWhite>> collect,Integer type) {
+        return collect.get(type).stream().map(IpWhite::ipAddr).distinct().collect(Collectors.toList());
+    }
+
+
+}

+ 9 - 0
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/ip/IpWhite.java

@@ -0,0 +1,9 @@
+package com.webflux.launchadmin.mysql.service.ip;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.relational.core.mapping.Table;
+
+@Table("ip_white")
+public record IpWhite(@Id Long id,String ipAddr,Integer status,Integer type) {
+
+}

+ 17 - 2
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceImpl.java

@@ -16,11 +16,13 @@ import com.webflux.launchadmin.mysql.controller.listening.res.ListeningPlanNewRe
 import com.webflux.launchadmin.mysql.controller.planNew.req.PlanReq;
 import com.webflux.launchadmin.mysql.controller.planNew.req.PlanReqPage;
 import com.webflux.launchadmin.mysql.controller.planNew.req.ServiceGroupSettingItemRequest;
+import com.webflux.launchadmin.mysql.controller.planNew.res.DataLists;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningAudio;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNew;
 import com.webflux.launchadmin.mysql.entity.listening.ListeningPlanNewBackgroupPoster;
 import com.webflux.launchadmin.mysql.entity.planNew.*;
 import com.webflux.launchadmin.mysql.service.customCode.CustomCodeServer;
+import com.webflux.launchadmin.mysql.service.ip.BlacklistService;
 import com.webflux.launchadmin.mysql.service.planNew.PlanServiceInterface;
 import com.webflux.launchadmin.mysql.service.planNew.goGenerate.GoGenerateService;
 import com.webflux.launchadmin.mysql.service.planNew.structure.GoRequest;
@@ -42,6 +44,7 @@ import org.springframework.data.relational.core.query.Query;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -66,6 +69,8 @@ public class ListeningPlanServiceImpl implements ListeningPlanServiceInterface{
     private SyncPlanNewListenToRedis syncPlanNewListenToRedis;
     @Autowired
     private CustomCodeServer customCodeServer;
+    @Autowired
+    private BlacklistService blacklistService;
     @Override
     public Mono<RStatus<Paged<ListeningPlanNewRes2>>> page(PlanReqPage request, Criteria criteria) {
         Query query = Query.query(criteria);
@@ -418,7 +423,7 @@ public class ListeningPlanServiceImpl implements ListeningPlanServiceInterface{
     }
 
     @Override
-    public Mono<RStatus<ListeningDataLists>> LandingPageList(OutListeningRequest outListeningRequest) {
+    public Mono<RStatus<ListeningDataLists>> LandingPageList(OutListeningRequest outListeningRequest, ServerWebExchange exchange) {
 //        Mono<ListeningPlanNew> code1 = template.selectOne(Query.query(Criteria.where("code")
 //                .is(outListeningRequest.getCode())), ListeningPlanNew.class)
 //                .switchIfEmpty(Mono.error(new BaseException(" code错误")))
@@ -454,7 +459,17 @@ public class ListeningPlanServiceImpl implements ListeningPlanServiceInterface{
                 return Mono.just(listeningDataLists);
             });
         });
-        return RStatus.success(idx_num1);
+        Mono<Boolean> rateReturn = blacklistService.getRateReturn(exchange);
+        return rateReturn.flatMap(bl->{
+            if(bl){
+                return  RStatus.success(idx_num1) ;
+            }else {
+                ListeningDataLists dataLists = new ListeningDataLists();
+                dataLists.setWxUrl(BlacklistService.wxUrl.get());
+                return RStatus.fail("1","",Mono.just(dataLists));
+            }
+        });
+       // return RStatus.success(idx_num1);
     }
     private static final ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<>();
     //清空用户Map数据

+ 2 - 1
launch-admin/src/main/java/com/webflux/launchadmin/mysql/service/listening/ListeningPlanServiceInterface.java

@@ -17,6 +17,7 @@ import com.webflux.launchcommon.returnObj.RStatus;
 import org.springframework.data.relational.core.query.Criteria;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
 import java.util.List;
@@ -29,7 +30,7 @@ public interface ListeningPlanServiceInterface {
     Mono<RStatus<ListeningAudio>> saveOrUpdateAudio(ListeningAudioReq saveRequest);
     Mono<RStatus<Paged<ListeningAudioRes>>> audioList(ListeningAudioReqPage request);
     Mono<RStatus<String>> copyById(String listeningPlanNewId);
-    Mono<RStatus<ListeningDataLists>> LandingPageList(OutListeningRequest outListeningRequest);
+    Mono<RStatus<ListeningDataLists>> LandingPageList(OutListeningRequest outListeningRequest, ServerWebExchange exchange);
     Mono<RStatus<DataListsShare>> share(OutListeningShareRequest outListeningRequest);
     Mono<RStatus<Long>> deleteAudioById(Long newAudioId);
 }

+ 11 - 1
launch-redis/src/main/java/com/weblux/launchredis/cacheConfig/CacheConfig.java

@@ -5,15 +5,25 @@ import com.google.common.cache.CacheBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.time.Duration;
+import java.time.LocalDateTime;
+
 
 @Configuration
 public class CacheConfig {
 
     @Bean
     public Cache<String, Object> guavaCache() {
+        long secondsUntilMidnight = getSecondsUntilNextMidnight();
         return CacheBuilder.newBuilder()
-                .expireAfterWrite(java.time.Duration.ofMinutes(10))  // 设置缓存过期时间
+                .expireAfterWrite(java.time.Duration.ofMinutes(secondsUntilMidnight))  // 设置缓存过期时间
                 .maximumSize(1000)  // 设置缓存最大容量
                 .build();
     }
+
+    private static long getSecondsUntilNextMidnight() {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime midnight = now.toLocalDate().plusDays(1).atStartOfDay().plusHours(0).plusSeconds(0).plusMinutes(1);
+        return   Duration.between(now, midnight).toMinutes();
+    }
 }