1场景描述
网站要实现自动化测试,但是界面上有图形验证码,所以没法自动化.
如何解决呢?
我专门为测试同事写了一个接口,用于返回图形验证码明文,比如
我返回的就是PFXa
但是这个接口不能暴露在线上,否则,你懂的....
所以我增加了一个白名单,白名单中是允许访问的ip.目前白名单只有内网ip,所以就算接口暴露在线上,别人也没法访问.
但是白名单中会有通配符,比如192.168.1.* ,因为电脑关机之后ip可能会变化
private static String[] whiteList = new String[]{"127.0.0.1", "11.1.213.200", "11.1.251.166", "11.11.62.*"};
在具体业务之前,会先校验ip是否在白名单中
if (StringUtil.isContains2(whiteList, ip) == -1) { map.put(KEY_RESULT, false); map.put(KEY_PARAM, "ip not in white list:" + ip); return JSONExtension.getJsonP(map, callback); }
2,使用正则表达式
isContains2 方法
功能:判断当前访问的ip是否在白名单中,不在,则直接报错
实现如下
public static int isContains2(String[] strArray, String j) { int index = Constant.NEGATIVE_ONE; if (isNullOrEmpty(strArray)) { return index; } int length2 = strArray.length; for (int ii = 0; ii < length2; ii++) { String i = strArray[ii]; if (i == j || (equalsWildcard(j, i))) { index = ii; break; } } return index; }
equalsWildcard方法如下:
/*** * * @param source * @param regex : 含有通配符,通配符只有一个:*.<br> * *表示任何字符,不限个数 * @return */ public static boolean equalsWildcard(String source,String regex){ regex=regex.replace(".", "\\."); regex=regex.replace("*", "(.*)");//加上小括号,方便查看 // System.out.println(regex); Pattern p = Pattern.compile("^"+regex+"$", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(source); return m.find(); }
对方法equalsWildcard()的单元测试
@Test public void test_equal(){ String source="ab.d.c"; // System.out.println(regex); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, ".b.d.c")); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, "a..d.c")); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, "a.*.d.c")); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, "abad.c")); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, "a*ad.c")); org.junit.Assert.assertFalse(RegexUtil.equalsWildcard(source, "ab.d..")); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, "ab.d.c")); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, source)); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, "a*.d.c")); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, "ab.*.c")); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, "ab*.c")); org.junit.Assert.assertTrue(RegexUtil.equalsWildcard(source, "ab*.d*c")); }
equalsWildcard说明:
有两个参数:
第一个参数:要比较的字符串,没有通配符,不是正则表达式.比如访问的ip;
第二个参数:包含通配符,目前只有一个通配符:* ,匹配若干个字符
相关推荐
本文档总结了 20 道 Java 面试题和答案,涵盖了 Java 基础知识、Java 和 C++ 的区别、Java 泛型、类型擦除、通配符、equals 和 == 的区别、final 关键字的作用等重要知识点。 JDK 和 JRE 的区别 JDK(Java ...
当两个字符串对象包含相同的字符序列时,equals方法返回true。这与Object类的equals方法不同,后者默认比较的是对象的引用。 4. 构造器和工厂方法: 理解构造器如何初始化对象以及工厂方法如何提供对象创建的抽象是...
JDK(Java Development Kit)是Java开发工具包,包含JRE(Java Runtime Environment)以及用于开发和调试Java程序的工具,如javac编译器。JRE仅提供运行Java程序所需的环境,不包括开发工具。 2. **`==`与`equals...
面试中可能会考察泛型的基本用法、通配符、类型擦除等概念。 以上只是Java面试中的一部分基础知识点,实际上面试可能会涉及更深入的话题,如反射、IO/NIO、设计模式、JVM内存模型、Spring框架等。为了在面试中...
- **知识点**: 在文件搜索过程中,通配符的作用及其种类。 - **详细解释**: 在进行文件查找时,可以使用通配符来帮助匹配文件名。通配符通常有两种:“?” 和 “*”。其中,“?” 表示任意单个字符,而 “*” 表示...
- **主要接口**包括: - `Set`:不包含重复元素的集合。 - `List`:有序且可能包含重复元素的集合。 - `Map`:键值对映射关系的集合。 - **具体实现类**: - `ArrayList`、`LinkedList`(List的实现)。 - `...
本压缩包包含的"Effective.Java3rd.pdf"是该书的中文翻译版,旨在帮助中文读者更好地理解和应用书中的编程理念。 在《Effective Java》第三版中,作者分享了28项关键的编程策略,涵盖了类和对象的设计、泛型、枚举...
在查询设计视图中,字段列表框中的选项包括排序(Sorting)、显示(Display)和准则(Criteria),但不包括类型(Type)。 13. 四舍五入为最接近的整数的函数: 在Java中,`Math.round()`函数用于将浮点数四舍五入...
下面是一个包含上述泛型类和方法使用的完整示例及其运行结果。 ```java public class Main { public static void main(String[] args) { // 使用泛型类 Box<Integer> intBox = new Box(10); Box<String> strBox...
19. SQL查询:使用LIKE操作符配合通配符可以查询名称中包含特定字符串的数据。 20. 保存网址:在IE浏览器中,使用收藏夹功能可以保存网址。 21. 窗口移动:按住窗口标题栏而非鼠标左按钮可移动窗口。 22. ISP含义:...
**equals与hashCode**:equals比较对象内容,hashCode用于哈希表定位,重写equals必须重写hashCode,保持一致性。 35-37. **String、StringBuffer与StringBuilder**:String是不可变的,而StringBuffer和...
- 泛型通配符如`?`和`extends`、`super`关键字用于增强泛型的灵活性。 6. **反射** - 反射允许程序在运行时动态访问和修改类的信息,如创建对象、调用方法、获取字段等。 - 反射的应用场景包括插件系统、动态...
7. **比较和equals**:在泛型上下文中正确地实现Comparable和equals()方法。 8. **枚举类型与泛型**:结合使用枚举和泛型来增强类型安全。 通过深入学习这本书籍,开发者可以更好地掌握Java泛型和集合的精髓,从而...
- `Object`类:所有Java类的基类,包含`equals()`, `hashCode()`, 和 `toString()`等方法。 - `String`类:不可变字符序列,提供了字符串操作的各种方法,如`concat()`, `substring()`, 和 `indexOf()`等。 - `...
这本书包含了369页的珍贵内容,旨在帮助开发者掌握编写高效、可维护和设计优良的Java代码的最佳实践。 1. **条目1:始终考虑使用接口( Favor Interfaces over Abstract Classes)** 接口提供了一种多继承机制,...
1. 文件查找:在Windows中查找文件时,使用通配符可以匹配文件名。题目中提到的"C."代表匹配以"A"开头,后面跟着任意一个字符的所有文件。 2. 编程语句:浮点型变量赋值可以包含小数和科学计数法,如题目中的A、B...
- **Like**:支持通配符 `%`(任意字符)、`*`(任意数量的任意字符)等。例如,查询客户 ID 包含 "AD" 的客户: ```csharp var query = from p in context.Customers where p.CustomerID.Contains("AD") ...
5. **泛型(Generics)**: 书中深入讲解了Java泛型的用法,包括类型擦除、类型参数化、通配符、边界等,代码示例可以帮助理解这些概念。 6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())...
5. **泛型**:讲解泛型的基本用法,包括类型擦除、边界通配符、类型推断,以及如何避免类型安全问题,如协变和逆变。 6. **可变与不可变对象**:强调不可变对象的优势,如安全性、线程安全和共享性,并提供了构建不...
例如,在实现模糊查询功能时,用户的搜索关键词可能包含SQL中的特殊字符,比如`%`、`_`等。如果不做任何处理,这些特殊字符将会被SQL引擎视为通配符,从而导致查询结果出现偏差。 #### 二、特殊字符处理方法 #####...