所有请求都没有到gateway的GlobalFilter

问题遇到的现象和发生背景

所有请求都没有到gateway的GlobalFilter

img

JwtCheckFilter

@Component
public class JwtCheckFilter implements GlobalFilter, Ordered {

    @Resource
    private RedisTemplate redisTemplate ;

    @Value("${no.require.urls:/admin/login,/user/gt/register,/user/login,/user/users/register,/user/sms/sendTo,/user/users/setPassword}")
    private Set<String> noRequireTokenUris ;


    /**
     * 过滤器拦截到用户的请求后做啥
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        if(!isRequireToken(exchange)){
            return chain.filter(exchange);
        }
        String token = getUserToken(exchange);
        if(StringUtils.isEmpty(token)){
            return buildeNoAuthorizationResult(exchange);
        }
        Boolean hasKey = redisTemplate.hasKey(token);
        if(hasKey!=null && hasKey){
            return chain.filter(exchange);
        }
        return buildeNoAuthorizationResult(exchange);
    }

    /**
     *
     * @param exchange
     * @return
     */
    private Mono<Void> buildeNoAuthorizationResult(ServerWebExchange exchange) {
        ServerHttpResponse response = exchange.getResponse();
        response.getHeaders().set("Content-Type","application/json");
        response.setStatusCode(HttpStatus.UNAUTHORIZED) ;
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("error","NoAuthorization") ;
        jsonObject.put("errorMsg","Token is Null or Error") ;
        DataBuffer wrap = response.bufferFactory().wrap(jsonObject.toJSONString().getBytes());
        return response.writeWith(Flux.just(wrap)) ;
    }

    /**
     *
     * @param exchange
     * @return
     */
    private String getUserToken(ServerWebExchange exchange) {
        String token = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
        return token == null ? null : token.replace("bearer ","") ;
    }

    /**
     *
     * @param exchange
     * @return
     */
    private boolean isRequireToken(ServerWebExchange exchange) {
        String path = exchange.getRequest().getURI().getPath();
        if(noRequireTokenUris.contains(path)){
            return false ; 
        }
        return Boolean.TRUE ;
    }


    /**
     *
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        loadbalancer:
          cache:
            enabled: true
            caffeine:
              spec: initialCapacity=500,expireAfterWrite=5s
    gateway:
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOriginPattern: # 允许哪些网站的跨域请求
              - "*"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
        - id: sys_route
          uri: lb://crm-sys
          predicates:
            - Path=/user/**

  application:
    name: crm-gateway
  redis:
    host: localhost
    port: 6379

server:
  port: 8090

请求的服务

img


img


img


img


img

尝试过的解决方法

改过application.name;
order的执行顺序

我想要达到的结果

所有请求能进GlobalFilter的filter方法

请求是否走了网关,其他服务和网关是不是在同一个namespace