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

Java 什么';写这个IP阀的正确方法是什么?,java,regex,tomcat,tomcat8,Java,Regex,Tomcat,Tomcat8,我试图通过请求者的ip地址使用阀门控制对tomcat(版本8)服务器的访问。我想要的是允许所有不以10开头的地址和所有以10.10开头的地址。这是我的 allow=“[^10]\.\d+\.\d+\.\d+\10\.10\.\d+.\d+”/> 它不工作,只允许访问从10.10开始的地址 正则表达式不是我最好的东西,我做错了什么 谢谢。[^10]不会排除以10开头的字符串,它将匹配任何不同于1或0的字符。因此,模式的第一部分将接受以下IP地址: 2.X.Y.Z,3.X.Y.Z,…,9.X.Y.

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


allow=“[^10]\.\d+\.\d+\.\d+\10\.10\.\d+.\d+”/>

它不工作,只允许访问从10.10开始的地址

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


谢谢。

[^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、3848等。但对于您的问题域来说,这可能没问题。

允许所有以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地址进行检查。

顺便说一句,tomcat开发人员提出的一个奇怪想法是,只实现基于regexp的IP过滤,而不实现基于网络掩码的过滤。在我看来,使用regex太过分了。我更愿意在这里使用网络掩码。