如何在jetty中使用主机名而不是IP?

时间:2016-01-24 15:42:05

标签: java jetty

我正在使用jetty中的IPAcccessHandler来限制对来自某些域的请求的访问。但是,我真的遇到了两个问题:

1-似乎IPAccessHandler只接受IP到白名单或黑名单,尽管它是Javadocs表示可以通过网址阻止。这是我的jetty-ipaccess.xml的XML片段:

  <Set name="black">
    <Array type="String">
      <Item>google.com</Item>
    </Array>
  </Set>

现在,如果我运行jetty,我会得到以下异常(即jetty无法启动):

Caused by: java.lang.IllegalArgumentException: Invalid IP address pattern: google.com

但如果我使用IP地址(例如127.0.0.1),那么码头就可以了。

2-现在说我通过阻止来自IP 127.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

到目前为止,我已经尝试了两天没有任何运气!非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

IPAccessHandler仅使用IP地址,因此名称。

使用主机名是非常低效(和错误的),无论是IPAccessHandler端的配置还是传入请求端的验证。

让我们用这个java代码来探索我的意思。

package net;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MultiDns
{
    public static void main(String[] args)
    {
        try
        {
            String hostname = "www.google.com";
            System.out.printf("Hostname: %s%n",hostname);
            for (InetAddress addr : InetAddress.getAllByName(hostname))
            {
                System.out.printf(" - %s [%s]%n",addr.getHostAddress(),InetAddress.getByAddress(addr.getAddress()).getHostName());
            }
        }
        catch (UnknownHostException 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(它们返回的结果为1e100.net addresses)。

在使用主机名进行访问控制的任何意义上,主机名和IP之间没有1 :: 1的关系。

即使您向配置端添加主机名,您也需要在每个请求上查询其主机名ips ,以了解传入请求的IP是否为允许或拒绝现在。这对于要执行的活动来说太昂贵了。

您可能认为Jetty只能使用dns请求的ttl / expiration来限制它对该域执行dns查询的次数。唉,Java无法访问dns响应的ttl信息。