zuul春季靴子国家

时间:2019-03-03 14:31:26

标签: spring-boot netflix-zuul

我使用api网关基于微服务模式开发了一些服务,我将zuul用于api网关,我想阻止网关中的某些国家/地区,由于需要错误页面和状态代码而无法在网络层中实现

1 个答案:

答案 0 :(得分:1)

国家/地区不在HTTP标头中。您将必须在IP和国家/地区之间进行映射。还要注意,客户端的远程地址可以通过多种方式(主要是直接和代理)进行传递。

因此您可以为创建一个Zuul过滤器:

@Component
public class CountryZuulFilter extends ZuulFilter {

    @Override
    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();
        String ip = ctx.getRequest()
                       .getHeader("Remote_Addr");
        if (ip == null) {
            ip = ctx.getRequest().getHeader("HTTP_X_FORWARDED_FOR");

            if (ip == null) {
                ip = ctx.getRequest().getRemoteAddr();
            }

        }
        // use an API to map the IP to a country
         String countryCode = lookupCountry(ip);
        // return a 401 if not authorized
        if (forbidenCountries.contains(countryCode)) {
            ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        }
        return null;
    }

    @Override
    public boolean shouldFilter() {
       return true;
   }

   @Override
   public String filterType() {
      return "pre";
   }

   @Override
   public int filterOrder() {
       return 0;
   }

}

要获取远程IP,请记入this answer