写这个IP阀的正确方法是什么?

时间:2015-01-23 21:12:07

标签: java regex tomcat tomcat8

我正在尝试使用阀门控制请求者的ip地址对我的tomcat(版本8)服务器的访问。我想要的是允许所有不以10开头的地址和所有以10.10开头的地址。这就是我所拥有的。

<valve className="org.apache.catalina.valves.RemoteAddrValve"> allow="[^10]\.\d+\.\d+\.\d+|10\.10\.\d+\.\d+" />

它不起作用,它只允许访问以10.10开头的地址。

正则表达式不是我最好的,我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:2)

允许所有以10.10开头的地址。您可以使用以下正则表达式:

10\.10\..*

\.对应“点”字符,.*对应任何内容。

要禁止所有以10.开头的地址,您必须写一些更复杂的内容:[^1].*对应于任何不以1开头的内容。没关系,如果IP地址不以1开头,我们会允许它。 1[^0].*对应于以1开头但第二个字符不是0的任何IP地址。 11xxx15xxx等。但我们必须允许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等。但是这可能对你来说没问题问题域。