客户做外贸用那些网站,专门做网站网站犯法吗,中国十大网络营销公司,做网站需要多少钱 爱问知识人遇到这么一个面试题#xff1a;如何在网关做配置#xff0c;实现只有在早晨9点到下午18点之间接口才允许访问#xff0c;其他时间访问都是404。 我们知道网关的一个重要的作用就是路由转发#xff0c;路由表的配置大概是这个样子:
spring:cloud:gateway:routes:- id: user…遇到这么一个面试题如何在网关做配置实现只有在早晨9点到下午18点之间接口才允许访问其他时间访问都是404。 我们知道网关的一个重要的作用就是路由转发路由表的配置大概是这个样子:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path/user/*上面的id是路由的名称uri是要路由到的目的地predicates就是断言过滤条件只有当访问的url路径是以/user开头的时候才会把请求转发到userservice上。 gateway中内置了很多断言规则每一种断言规则背后都是实现了AbstractRoutePredicateFactory的一个实现类比如Path断言org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory。但是gateway并没有提供一个根据时间做过滤条件的断言工厂因此我们可以自定义一个断言工厂实现这个功能。 那如何来自定义一个断言工厂呢 首先写一个AbstractRoutePredicateFactory的实现类
/*** 自定义的断言工厂br* 1.名称必须是配置RoutePredicateFactorybr* 2.必须继承AbstractRoutePredicateFactory配置类*/
Component
public class HourRoutePredicateFactory extends AbstractRoutePredicateFactoryHourRoutePredicateFactory.Config {public HourRoutePredicateFactory() {super(HourRoutePredicateFactory.Config.class);}//读取配置文件的参数值赋值到配置类中的属性上public ListString shortcutFieldOrder() {//顺序必须与yml文件中的配置顺序对应return Arrays.asList(startHour, endHour);}public PredicateServerWebExchange apply(HourRoutePredicateFactory.Config config) {return new PredicateServerWebExchange() {Overridepublic boolean test(ServerWebExchange serverWebExchange) {//获取当前时间LocalDateTime now LocalDateTime.now();int hour now.getHour();if(hour config.getStartHour() hour config.getEndHour()){return true;}return false;}};}//用于接收参数DataNoArgsConstructorpublic static class Config {private int startHour;private int endHour;}
}然后在配置文件中使用就可以了比如:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://userservicepredicates:- Path/user/*- Hour9,18打开浏览器测试一下如果当前时间是在9-18点之间可以正常访问否则返回404。 源码下载https://github.com/xjs1919/enumdemo/tree/master/gateway-predicate-demo