Menjalankan kode ini dengan JDK 1.8:
try {
System.out.println( new URI(null, null, "5-12-145-35_s-81", 443, null, null, null));
} catch (URISyntaxException e) {
e.printStackTrace();
}
mengakibatkan kesalahan ini: java.net.URISyntaxException: Illegal character in hostname at index 13: //5-12-145-35_s-81:443
Dari mana asal kesalahan ini, mengingat semua karakter nama host tampak sah, menurut Jenis karakter URI ?
Jika saya menggunakan URL ini: //5-12-145-35_s-81:443
atau /5-12-145-35_s-81:443
kesalahan hilang.
Dari komentar, saya mengerti bahwa, menurut RFC-2396 , nama host tidak dapat berisi karakter garis bawah.
Pertanyaan yang masih ada adalah mengapa nama host yang dimulai dengan slash atau double slash diizinkan berisi garis bawah?
-
, dipisahkan dengan titikJawaban:
Nama host harus cocok dengan sintaks berikut:
Seperti yang Anda lihat, hanya
.
dan-
diizinkan,_
tidak.Anda kemudian mengatakan bahwa
//5-12-145-35_s-81:443
itu diperbolehkan, dan memang demikian, tetapi tidak untuk nama host .Untuk melihat bagaimana hasilnya:
Keluaran
Seperti yang Anda lihat, ketika
authority
memiliki nama host yang valid,host
danport
diuraikan, tetapi ketika tidak valid,authority
diperlakukan sebagai teks bentuk bebas, dan tidak diuraikan lebih lanjut.MEMPERBARUI
Dari komentar:
The
URI
konstruktor Anda panggil sedang adalah metode kenyamanan, dan sederhana membangun URI tali penuh dan kemudian mem-parsing itu.Passing
"5-12-145-35_s-81", 443
menjadi//5-12-145-35_s-81:443
.Passing
"/5-12-145-35_s-81", 443
menjadi///5-12-145-35_s-81:443
.Yang pertama, ini adalah host dan port , dan gagal mengurai.
Pada bagian kedua bagian otoritas kosong, dan
/5-12-145-35_s-81:443
merupakan jalan .Keluaran
sumber
/a_b
, diizinkan. Satu-satunya perbedaan adalah bahwa ini mutlak, bukan relatifSystem.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))
output:///5-12-145-35_s-81:443
. Saya memberikannya sebagai nama host.Bug ini bukan di Jawa tetapi dalam penamaan host, karena garis bawah bukan karakter yang valid dalam nama host. Meskipun banyak digunakan secara tidak benar, Java menolak untuk menangani nama host tersebut
sumber
/5-12-145-35_s-81:443
ini legal.Garis bawah tidak didukung di URI.
Wikipedia
Dari Javadocs:
Javadocs
Solusi (Meretas):
Ini dilaporkan sebagai - JDK bug
sumber
null
sebagai tuan rumah.