2012-07-25 38 views
7

java.net.InetAddress giải quyết hostname sử dụng mặc định host-name phân giải máy cục bộ bằng cách mặc định:Cách định cấu hình độ phân giải tên máy chủ để sử dụng máy chủ DNS tùy chỉnh trong Java?

chủ tên-to-IP độ phân giải địa chỉ được thực hiện thông qua việc sử dụng một sự kết hợp của thông tin cấu hình máy tính cục bộ và mạng đặt tên các dịch vụ như Hệ thống tên miền (DNS) và Dịch vụ thông tin mạng (NIS). (Các) dịch vụ đặt tên cụ thể đang được sử dụng là theo mặc định, máy cục bộ được định cấu hình. Đối với bất kỳ tên máy chủ nào, địa chỉ IP tương ứng của nó được trả về. [source]

Làm sao chúng ta có thể cấu hình hành vi này mà không sửa đổi phân giải tên máy mặc định máy tính cục bộ không? Ví dụ:

Ví dụ: có cấu hình java.net.InetAddress sao cho nó phân giải tên máy chủ thông qua OpenDNS (208.67.222.222, 208.67.220.220) hoặc DNS công khai của Google (2001: 4860: 4860 :: 8888, 2001: 4860: 4860: : 8844)?

Hoặc là giải pháp duy nhất để tạo yêu cầu gói DNS một cách rõ ràng, gửi chúng đến máy chủ thông qua java.net.DatagramSocket hoặc java.net.Socket và phân tích cú pháp câu trả lời?

Trả lời

8

Java 9 đã xóa khả năng này. Bạn sẽ cần sử dụng thư viện máy khách DNS của bên thứ ba.

Nếu bạn đang sử dụng Java 8 hoặc cũ hơn, bạn có thể làm:

Bạn có thể thiết lập các hệ thống sở hữu sun.net.spi.nameservice.nameservers như ghi nhận bởi this site.

+1

Như được ghi trong cùng một trang web: "Các thuộc tính này có thể không được hỗ trợ trong các bản phát hành trong tương lai". Có cách nào khác để đạt được điều đó không? – bernatp

+2

Không. Không, nếu bạn muốn sử dụng 'java.net.InetAddress'. Nếu bạn đang sử dụng một cơ chế khác thì bạn có thể sử dụng thư viện DNS của bên thứ 3 (ví dụ: [dnsjava] (http://www.dnsjava.org/)). Lý do thực sự duy nhất mà thuộc tính có thể thay đổi là nếu Oracle sửa chữa quá trình triển khai 'java.net' trong một số phiên bản Java tương lai. Nếu điều này xảy ra, họ có thể sẽ cung cấp một giải pháp mới cho vấn đề này tại thời điểm đó. – Pace

+0

Họ đã đại tu 'java.net' trong Java 9, vì vậy các lớp' sun.net' cần thiết để kéo nó không còn tồn tại nữa. – ndm13

1

Đây là mã tôi đã viết để mã hóa cứng một foo hệ thống tên DNS giải quyết trong Java cho các trường hợp thử nghiệm để vượt qua. Avantage của nó là để thêm entrie cụ thể của bạn (s) để mặc định Java thời gian chạy DNS giải quyết.

Tôi khuyên bạn nên không được chạy trong sản xuất. Truy cập phản chiếu cưỡng bức và các lớp thực hiện không công khai Java runtime được sử dụng!

private static final String FOO_IP = "10.10.8.111"; 

/** Fake "foo" DNS resolution */ 
@SuppressWarnings("restriction") 
public static class MyHostNameService implements sun.net.spi.nameservice.NameService { 
    @Override 
    public InetAddress[] lookupAllHostAddr(String paramString) throws UnknownHostException { 
     if ("foo".equals(paramString) || "foo.domain.tld".equals(paramString)) { 
      final byte[] arrayOfByte = sun.net.util.IPAddressUtil.textToNumericFormatV4(FOO_IP); 
      final InetAddress address = InetAddress.getByAddress(paramString, arrayOfByte); 
      return new InetAddress[] { address }; 
     } else { 
      throw new UnknownHostException(); 
     } 
    } 
    @Override 
    public String getHostByAddr(byte[] paramArrayOfByte) throws UnknownHostException { 
     throw new UnknownHostException(); 
    } 
} 

static { 
    // Force to load fake hostname resolution for tests to pass 
    try { 
     List<sun.net.spi.nameservice.NameService> nameServices = 
      (List<sun.net.spi.nameservice.NameService>) 
      org.apache.commons.lang3.reflect.FieldUtils.readStaticField(InetAddress.class, "nameServices", true); 
     nameServices.add(new MyHostNameService()); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
} 

Hy vọng điều này sẽ giúp, nhưng một lần nữa, được sử dụng cẩn thận!

Các vấn đề liên quan