หากคุณต้องการที่จะแยก URL java.net.URI
ที่ใช้ java.net.URL
มีปัญหามากมาย - equals
วิธีการของมันทำการค้นหา DNS ซึ่งหมายความว่าโค้ดที่ใช้อาจเสี่ยงต่อการถูกปฏิเสธการโจมตีบริการเมื่อใช้กับอินพุตที่ไม่น่าเชื่อถือ
"มิสเตอร์กอสลิง - ทำไมคุณถึงทำให้ url เท่ากับห่วย" อธิบายปัญหาดังกล่าวอย่างหนึ่ง แค่ติดนิสัยใช้java.net.URI
แทน
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;
}
ควรทำในสิ่งที่คุณต้องการ
แม้ว่าดูเหมือนว่าจะทำงานได้ดี แต่มีแนวทางที่ดีกว่านี้หรือมีกรณีขอบบางอย่างที่อาจล้มเหลว
รหัสของคุณตามที่เขียนล้มเหลวสำหรับ URL ที่ถูกต้อง:
httpfoo/bar
- URL http
ที่เกี่ยวข้องกับองค์ประกอบเส้นทางที่เริ่มต้นด้วย
HTTP://example.com/
- โปรโตคอลไม่คำนึงถึงขนาดตัวพิมพ์
//example.com/
- URL สัมพัทธ์ของโปรโตคอลกับโฮสต์
www/foo
- URL สัมพัทธ์ที่มีองค์ประกอบเส้นทางที่ขึ้นต้นด้วย www
wwwexample.com
- ชื่อโดเมนที่ไม่ได้ขึ้นต้นด้วยwww.
แต่ขึ้นต้นด้วยwww
.
URL ตามลำดับชั้นมีไวยากรณ์ที่ซับซ้อน หากคุณพยายามหมุนตัวแยกวิเคราะห์ของคุณเองโดยไม่อ่าน RFC 3986 อย่างละเอียดคุณอาจเข้าใจผิด เพียงใช้อันที่มีอยู่ในไลบรารีหลัก
หากคุณต้องการจัดการกับอินพุตที่ยุ่งเหยิงที่java.net.URI
ปฏิเสธโปรดดูRFC 3986ภาคผนวก B:
ภาคผนวก B. การแยกวิเคราะห์ข้อมูลอ้างอิง URI ด้วยนิพจน์ทั่วไป
เนื่องจากอัลกอริทึม "การจับคู่ครั้งแรกชนะ" นั้นเหมือนกับวิธีการลดความบกพร่อง "โลภ" ที่ใช้โดยนิพจน์ทั่วไปของ POSIX จึงเป็นเรื่องปกติที่จะใช้นิพจน์ทั่วไปสำหรับการแยกวิเคราะห์องค์ประกอบที่เป็นไปได้ทั้งห้าของการอ้างอิง URI
บรรทัดต่อไปนี้เป็นนิพจน์ทั่วไปสำหรับการแยกย่อยการอ้างอิง URI ที่มีรูปแบบดีลงในส่วนประกอบ
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
ตัวเลขในบรรทัดที่สองด้านบนเป็นเพียงเพื่อช่วยในการอ่านเท่านั้น พวกเขาระบุจุดอ้างอิงสำหรับแต่ละนิพจน์ย่อย (กล่าวคือแต่ละวงเล็บที่จับคู่)
http://74.125.226.70
แจ้งให้เราทราบวิธีการทำงาน :)