Spring 在 zuul 中启动块国家
Spring boot Block country in zuul
我用 api 网关开发了一些基于微服务模式的服务,我使用 zuul 作为 api 网关,我想在网关中屏蔽一些国家,我无法在网络层实现它,因为我需要错误页面和状态码
国家/地区不在 HTTP Header 中。您将必须在 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。
我用 api 网关开发了一些基于微服务模式的服务,我使用 zuul 作为 api 网关,我想在网关中屏蔽一些国家,我无法在网络层实现它,因为我需要错误页面和状态码
国家/地区不在 HTTP Header 中。您将必须在 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。