/**
* iPv4
*/
public static final String PORTAL_APPIPV4_VALIDATED="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
上面是ipv4的,接下来是ipv6d
/**
* ipv6
*/
public static final String PORTAL_APPIPV6_VALIDATED="(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4})|" + "(([0-9a-fA-F]{1,4}:){1,7}:)|"
+ "(([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4})|" + "(([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2})|"
+ "(([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3})|"
+ "(([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4})|"
+ "(([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5})|"
+ "([0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:)+" + "((:[0-9a-fA-F]{1,4}){1,7}|:)|"
+ "([0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,7})|:)+";
先说一下ipv4和ipv6的示例:
当涉及IPV4时,以下是一些IP地址示例:
- IPV4: 192.0.2.1
- IPV4: 172.16.254.1
- IPV4: 10.0.0.1
而对于IPv6,这里有一些示例(包括缩写形式):
- IPV6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334
- IPV6: 2001:db8::1
- IPV6: 2001:0db8:0:0:0:0:2:1
如果对应请求类来说你们的字段是分开判断的,那么直接在字段上+注解
@Pattern (regexp = FieldValidatedPatterns.PORTAL_SEMICOLON_VALIDATE, message = "ip白名单配置格式不正确")
我这个是一个字段可以是ipv4也可以是ipv6(含缩写形式)之间用;隔开,不允许超过五十个
我们得到这个字符串ip,去进行判断,判断后去重,然后将List转化成string
//效验IP是否正确,如果不正确返回Null,正确返回String
public String ipValidation(String input){
List<String> resultList=new ArrayList<> ();
//定义ipv6与其缩写
String ipv6SmallRegex = FieldValidatedPatterns.PORTAL_APPIPV6_VALIDATED;
//定义ipv4
String ipv4Regex = FieldValidatedPatterns.PORTAL_APPIPV4_VALIDATED;
//分割input
String[] ips = input.split (";");
Pattern ipv6SmallPattern = Pattern.compile (ipv6SmallRegex);
for (String ip : ips)
{
Matcher ipv6SmallMatcher = ipv6SmallPattern.matcher (ip);
if (!ipv6SmallMatcher.matches ())
{
//ipv6格式不正确开始判断ipv4
Pattern ipv4Pattern = Pattern.compile (ipv4Regex);
Matcher ipv4PatternMatcher = ipv4Pattern.matcher (ip);
if (ipv4PatternMatcher.matches ())
{
resultList.add (ip);
}
else
{
//全部不正确
log.info ("regular Not compliant-ipv4:{}",ip);
return null;
}
}else{
resultList.add (ip);
}
}
if(resultList.isEmpty ()){
return null;
}
if(resultList.size ()>50){
log.info ("regular Not compliant-size50:{}",resultList.size ());
return null;
}
//如果格式全部正确,开始去重
List<String> deduplicatedList = resultList.stream()
.distinct()
.collect(Collectors.toList());
return String.join (";",deduplicatedList);