Java 如何在jetty中使用主机名而不是IP?
我正在使用in jetty来限制对来自特定域的请求的访问。然而,我确实遇到了两个问题: 1-似乎Java 如何在jetty中使用主机名而不是IP?,java,jetty,Java,Jetty,我正在使用in jetty来限制对来自特定域的请求的访问。然而,我确实遇到了两个问题: 1-似乎IPAccessHandler只接受白名单或黑名单的IP,尽管据说可以通过URL进行阻止。这是my jetty-ipaccess.XML的一个XML片段: <Set name="black"> <Array type="String"> <Item>google.com</Item> </Array> &l
IPAccessHandler
只接受白名单或黑名单的IP,尽管据说可以通过URL进行阻止。这是my jetty-ipaccess.XML的一个XML片段:
<Set name="black">
<Array type="String">
<Item>google.com</Item>
</Array>
</Set>
但是如果我使用IP地址(例如127.0.0.1
),那么jetty就可以正常启动
2-现在假设我通过阻止来自IP127.0.0.1
的访问启动jetty,那么如果我尝试在浏览器中请求127.0.0.1
,我会得到正确的禁止错误。如果我尝试请求http://localhost
,则我得到以下错误:
HTTP ERROR: 500
Problem accessing /. Reason:
java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1
到目前为止,我已经试了两天了,一点运气都没有!非常感谢您的帮助 IPAccessHandler仅使用IP地址,因此得名 在
IPAccessHandler
端的配置或传入请求端的验证中使用主机名是非常低效的(也是错误的)
让我们使用这个java代码来探索我的意思
包网;
导入java.net.InetAddress;
导入java.net.UnknownHostException;
公共类多DNS
{
公共静态void main(字符串[]args)
{
尝试
{
字符串hostname=“www.google.com”;
System.out.printf(“主机名:%s%n”,主机名);
for(InetAddress地址:InetAddress.getAllByName(主机名))
{
System.out.printf(“-%s[%s]%n”,addr.getHostAddress(),InetAddress.getByAddress(addr.getAddress()).getHostName());
}
}
捕获(未知后异常e)
{
e、 printStackTrace();
}
}
}
我对google.com
的查询结果如下所示
Hostname:www.google.com
-74.125.25.106[pa-in-f106.1e100.net]
-74.125.25.99[pa-in-f99.1e100.net]
-74.125.25.104[pa-in-f104.1e100.net]
-74.125.25.147[pa-in-f147.1e100.net]
-74.125.25.105[pa-in-f105.1e100.net]
-74.125.25.103[pa-in-f103.1e100.net]
-2607:f8b0:400e:c00:0:0:0:67[pf-in-x67.1e100.net]
由于我住在亚利桑那州,我得到了上述结果,但如果你住在欧洲或亚洲(作为例子),你会得到不同的结果
你今天看到的结果,以后可能会有所不同
此外,当您将查询返回的IP返回到google.com时,您将看到您无法从这些IP解析回google.com(这些IP返回搜索结果)
在任何意义上,使用主机名进行访问控制都是有意义的,主机名和IP之间没有1::1关系
即使您将主机名添加到配置端,您也需要在每个请求上查询该主机名的IP,以了解传入请求的IP现在是允许还是拒绝。这是一项成本太高的活动,无法执行
您可能认为Jetty可以使用dns请求的ttl/过期来限制它对该域执行dns查询的次数。遗憾的是,Java无法访问dns响应的ttl信息
HTTP ERROR: 500
Problem accessing /. Reason:
java.lang.IllegalArgumentException: Invalid IP address: 0:0:0:0:0:0:0:1