Jika Anda ingin menguraikan URL, gunakan java.net.URI
. java.net.URL
memiliki banyak masalah - equals
metodenya melakukan pencarian DNS yang berarti kode yang menggunakannya dapat rentan terhadap serangan penolakan layanan ketika digunakan dengan input yang tidak dipercaya.
"Mr. Gosling - mengapa Anda membuat url sama dengan mengisap?" menjelaskan satu masalah seperti itu. Biasakan menggunakan saja java.net.URI
sebagai gantinya.
public static String getDomainName(String url) throws URISyntaxException {
URI uri = new URI(url);
String domain = uri.getHost();
return domain.startsWith("www.") ? domain.substring(4) : domain;
}
harus melakukan apa yang Anda inginkan.
Meskipun tampaknya berfungsi dengan baik, apakah ada pendekatan yang lebih baik atau ada beberapa kasus tepi, yang bisa gagal.
Kode Anda sebagai tulisan gagal untuk URL yang valid:
httpfoo/bar
- URL relatif dengan komponen jalur yang dimulai dengan http
.
HTTP://example.com/
- protokol tidak peka huruf besar-kecil.
//example.com/
- protokol URL relatif dengan host
www/foo
- URL relatif dengan komponen jalur yang dimulai dengan www
wwwexample.com
- nama domain yang tidak dimulai dengan www.
tetapi dimulai dengan www
.
URL hierarkis memiliki tata bahasa yang kompleks. Jika Anda mencoba untuk menggulung parser Anda sendiri tanpa membaca RFC 3986 dengan hati-hati, Anda mungkin salah. Cukup gunakan yang dibangun ke perpustakaan inti.
Jika Anda benar-benar harus berurusan dengan input berantakan yang java.net.URI
menolak, lihat RFC 3986 Lampiran B:
Lampiran B. Mengurai Referensi URI dengan Ekspresi Reguler
Karena algoritme "pertandingan pertama menang" identik dengan metode disambiguasi "serakah" yang digunakan oleh ekspresi reguler POSIX, wajar dan umum untuk menggunakan ekspresi reguler untuk mengurai lima komponen potensial dari referensi URI.
Baris berikut adalah ekspresi reguler untuk memecah referensi URI yang terbentuk dengan baik ke dalam komponen-komponennya.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Angka-angka pada baris kedua di atas hanya untuk membantu keterbacaan; mereka menunjukkan titik referensi untuk setiap sub-ekspresi (yaitu, masing-masing tanda kurung dipasangkan).
http://74.125.226.70
dan beri tahu saya cara kerjanya :)