diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListFilter.java new file mode 100644 index 00000000..4f6cc5db --- /dev/null +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListFilter.java @@ -0,0 +1,65 @@ +package com.ruoyi.gateway.filter; + +import lombok.extern.log4j.Log4j2; +import org.springframework.cloud.gateway.filter.GatewayFilterChain; +import org.springframework.cloud.gateway.filter.GlobalFilter; +import org.springframework.core.Ordered; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.http.server.reactive.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * 黑名单过滤器 + * + * @author xiejs + * @since 2022-05-26 + */ +@Component +@Log4j2 +public class BlackListFilter implements GlobalFilter, Ordered { + + private static final List blackList = new CopyOnWriteArrayList<>(); + + + static { + blackList.add("192.168.2.20"); + } + + @Override + public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { + //获取客户端ip,判断是否在黑名单中,在的话拒绝访问,不在就放行 + + ServerHttpRequest request = exchange.getRequest(); + ServerHttpResponse response = exchange.getResponse(); + ServerHttpRequest.Builder mutate = request.mutate(); + + //从request对象中获取客户端ip + String clientIp = Objects.requireNonNull(request.getRemoteAddress()).getHostString(); + if (blackList.contains(clientIp)) { + //拒绝访问,返回 + response.setStatusCode(HttpStatus.UNAUTHORIZED); + log.debug("====>IP:"+clientIp+"在黑名单中,被拒绝访问!"); + String data = "Request be denied!"; + DataBuffer dataBuffer = response.bufferFactory().wrap(data.getBytes(StandardCharsets.UTF_8)); + + return response.writeWith(Mono.just(dataBuffer)); + } else { + //合法请求,放行,执行后续的过滤器 + return chain.filter(exchange.mutate().request(mutate.build()).build()); + } + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/xjs-study/springcloud-project/eureka/eureka-client-consumer/pom.xml b/xjs-study/springcloud-project/eureka/eureka-client-consumer/pom.xml index df16a883..2aee7521 100644 --- a/xjs-study/springcloud-project/eureka/eureka-client-consumer/pom.xml +++ b/xjs-study/springcloud-project/eureka/eureka-client-consumer/pom.xml @@ -27,6 +27,11 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-openfeign + diff --git a/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/EurekaClientConsumerApp.java b/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/EurekaClientConsumerApp.java index 8d63debe..1771173d 100644 --- a/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/EurekaClientConsumerApp.java +++ b/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/EurekaClientConsumerApp.java @@ -3,6 +3,8 @@ package com.xjs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @@ -15,6 +17,7 @@ import org.springframework.web.client.RestTemplate; //@EnableEurekaClient //开启Eureka client @EnableDiscoveryClient //开启注册中心客户端 //从springCloud的Edgware版本开始,不加[@EnableDiscoveryClient]注解也行,建议加上 +@EnableFeignClients public class EurekaClientConsumerApp { public static void main(String[] args) { @@ -23,6 +26,7 @@ public class EurekaClientConsumerApp { @Bean + @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } diff --git a/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/controller/TimeController.java b/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/controller/TimeController.java index 4dbdf91a..0de1d589 100644 --- a/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/controller/TimeController.java +++ b/xjs-study/springcloud-project/eureka/eureka-client-consumer/src/main/java/com/xjs/controller/TimeController.java @@ -44,4 +44,6 @@ public class TimeController { return restTemplate.getForObject(url, String.class); } + + }