我正在尝试使用阀门控制请求者的ip地址对我的tomcat(版本8)服务器的访问。我想要的是允许所有不以10开头的地址和所有以10.10开头的地址。这就是我所拥有的。
<valve className="org.apache.catalina.valves.RemoteAddrValve">
allow="[^10]\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+" />
它不起作用,它只允许访问以10.10开头的地址。
正则表达式不是我最好的,我做错了什么?
感谢。
答案 0 :(得分:2)
允许所有以10.10开头的地址。您可以使用以下正则表达式:
10\.10\..*
\.
对应“点”字符,.*
对应任何内容。
要禁止所有以10.
开头的地址,您必须写一些更复杂的内容:[^1].*
对应于任何不以1
开头的内容。没关系,如果IP地址不以1
开头,我们会允许它。 1[^0].*
对应于以1
开头但第二个字符不是0
的任何IP地址。 11xxx
,15xxx
等。但我们必须允许101.xxx
等地址。所以我们必须写10[^.].*
。除了10.xxx
之外,这个表达式将允许任何其他内容。
所以最终的正则表达式看起来就像上面所有表达式之间的替代:
10\.10\..*|[^1].*|1[^0].*|10[^.].*
或略微简化:
(10\.10\.|[^1]|1[^0]|10[^.]).*
现在最好在开头添加^
,最后添加$
,以确保此表达式将检查整个IP地址:
^(10\.10\.|[^1]|1[^0]|10[^.]).*$
我根本没有检查输入值是否为IP地址,但我确信tomcat除了IP地址之外不会传递任何内容。
答案 1 :(得分:0)
[^ 10]不会排除以10开头的字符串,它将匹配任何不同于1或0的字符。因此,模式的第一部分将接受以下IP地址: 2.X.Y.Z,3.X.Y.Z,...,9.X.Y.Z。
为了实现目标,你可以尝试这样的事情:
d\.\d+\.\d+\.\d+|[02-9]d\.\d+\.\d+\.\d+|[1-9]dd\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+
通过这种方式,第一个替代方案将接受以单个数字开头的任何IP。第二个,任何以两位开头的IP,不包括10.第三个,任何以三位数开头的IP(因此也不能是10位)。
还有一句话:通过使用d +来匹配数字,即使是无效的值也可能被接受为IP组件(应该在0-255之间),例如257,3888等。但是这可能对你来说没问题问题域。