1.引用 aviator
<dependency> <groupId>com.googlecode.aviator</groupId> <artifactId>aviator</artifactId> <version>4.1.2</version> </dependency>
2.
import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import com.googlecode.aviator.AviatorEvaluator; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; public class CustomAuth { private static Map<RequestScene, String> mapping = ImmutableMap.<RequestScene, String>builder() //小于3天的注册,而且没有投资过,大概率是 骗子,要求验证 .put(RequestScene.Withdraw, "{注册天数}<3 && {投资次数}==0") .build(); public static boolean isInvalidateRequest(int customerId, RequestScene scene) { return AuthFactory.process(customerId, mapping.get(scene)); } public static void main(String[] args) { boolean isInvalidateRequest = isInvalidateRequest(10001, RequestScene.Withdraw); System.out.println("客户10001行为:" + (isInvalidateRequest ? "非法" : "合法")); isInvalidateRequest = isInvalidateRequest(10002, RequestScene.Withdraw); System.out.println("客户10002行为:" + (isInvalidateRequest ? "非法" : "合法")); isInvalidateRequest = isInvalidateRequest(10003, RequestScene.Withdraw); System.out.println("客户10003行为:" + (isInvalidateRequest ? "非法" : "合法")); } } class AuthFactory { private static Map<String, GetDatable> mapping = ImmutableMap.<String, GetDatable>builder() //这里可以修改成自动register .put("{注册天数}", new GetRegDays()) .put("{投资次数}", new GetInvestTimes()) .build(); /** * 过滤 变量 的正则 */ public static final Pattern DATA_PATTERN = Pattern.compile("\{[a-zA-Z0-9\u4e00-\u9fa5]+\}"); public static boolean process(int customerId, String expr) { Set<String> dataSet = new HashSet<>(); Matcher matcher = DATA_PATTERN.matcher(expr); while (matcher.find()) { String dataSources = matcher.group(0); dataSet.add(dataSources); } Set<GetDatable> getDataSet = dataSet.stream().map(p -> mapping.get(p)).collect(Collectors.toSet()); List<Map<String, Object>> collect = getDataSet.stream().parallel().map( p -> p.get(customerId)).collect(Collectors.toList()); Map<String, Object> result = new HashMap<>(); for (Map<String, Object> item : collect) { result.putAll(item); } String resolveExpress = expr; for (String item : dataSet) { resolveExpress = resolveExpress.replace(item, result.get(item).toString()); } return (Boolean) AviatorEvaluator.execute(resolveExpress); } } enum RequestScene { Login, Withdraw } interface GetDatable { Map<String, Object> get(int customerId); } class GetRegDays implements GetDatable { @Override public Map<String, Object> get(int customerId) { int days = 1; if (customerId == 10001) { days = 1; } else if (customerId == 10002) { days = 2; } else if (customerId == 10003) { days = 3; } return ImmutableMap.of("{注册天数}", days,"{开户天数}",1); } } class GetInvestTimes implements GetDatable { @Override public Map<String, Object> get(int customerId) { /* Random random = new Random(); int i = random.nextInt(3);*/ int times = 1; if (customerId == 10001) { times = 0; } else if (customerId == 10002) { times = 1; } else if (customerId == 10003) { times = 0; } return ImmutableMap.of("{投资次数}", times); } }
客户10001行为:非法
客户10002行为:合法
客户10003行为:合法