package com.ruoyi.gateway.filter;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.regex.Pattern;
|
|
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
|
import org.springframework.stereotype.Component;
|
import com.ruoyi.common.core.utils.ServletUtils;
|
|
/**
|
* 黑名单过滤器
|
*
|
* @author ruoyi
|
*/
|
@Component
|
public class BlackListUrlFilter extends AbstractGatewayFilterFactory<BlackListUrlFilter.Config> {
|
public BlackListUrlFilter() {
|
super(Config.class);
|
}
|
|
@Override
|
public GatewayFilter apply(Config config) {
|
return (exchange, chain) -> {
|
|
String url = exchange.getRequest().getURI().getPath();
|
if (config.matchBlacklist(url)) {
|
return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问");
|
}
|
|
return chain.filter(exchange);
|
};
|
}
|
|
public static class Config {
|
private List<String> blacklistUrl;
|
|
private List<Pattern> blacklistUrlPattern = new ArrayList<>();
|
|
public boolean matchBlacklist(String url) {
|
return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find());
|
}
|
|
public List<String> getBlacklistUrl() {
|
return blacklistUrl;
|
}
|
|
public void setBlacklistUrl(List<String> blacklistUrl) {
|
this.blacklistUrl = blacklistUrl;
|
this.blacklistUrlPattern.clear();
|
this.blacklistUrl.forEach(url -> {
|
this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE));
|
});
|
}
|
}
|
|
}
|