Bir URL ayrıştırmak istiyorsanız, kullanın java.net.URI
. java.net.URL
bir sürü sorunu vardır - equals
yöntemi bir DNS araması yapar, bu da onu kullanan kodun, güvenilmeyen girdilerle kullanıldığında hizmet reddi saldırılarına karşı savunmasız olabileceği anlamına gelir.
"Bay Gosling - neden url eşittir berbat yaptınız?" böyle bir sorunu açıklıyor. Bunun java.net.URI
yerine kullanmayı alışkanlık haline getirin .
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;
}
ne istersen yapmalısın.
İyi çalışıyor gibi görünse de, daha iyi bir yaklaşım var mı veya başarısız olabilecek bazı uç durumlar var mı?
Yazılan kodunuz geçerli URL'ler için başarısız:
httpfoo/bar
- ile başlayan bir yol bileşenine sahip göreli URL http
.
HTTP://example.com/
- protokol büyük / küçük harf duyarlıdır.
//example.com/
- bir ana bilgisayarla protokole göre URL
www/foo
- ile başlayan bir yol bileşenine sahip göreli bir URL www
wwwexample.com
- ile www.
başlamayan ancak ile başlayan alan adı www
.
Hiyerarşik URL'lerin karmaşık bir dilbilgisi vardır. RFC 3986'yı dikkatlice okumadan kendi ayrıştırıcınızı döndürmeye çalışırsanız, muhtemelen yanlış anlayacaksınız. Çekirdek kitaplıklarda yerleşik olanı kullanın.
Reddeten karışık girdilerle gerçekten uğraşmanız gerekiyorsa java.net.URI
, bkz. RFC 3986 Ek B:
Ek B. Bir URI Referansını Normal Bir İfadeyle Ayrıştırma
"İlk eşleştirme kazanır" algoritması, POSIX normal ifadeleri tarafından kullanılan "açgözlü" belirsizliği giderme yöntemiyle aynı olduğundan, bir URI referansının potansiyel beş bileşenini ayrıştırmak için normal bir ifade kullanmak doğal ve olağandır.
Aşağıdaki satır, iyi biçimlendirilmiş bir URI referansını bileşenlerine ayırmak için kullanılan normal ifadedir.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Yukarıdaki ikinci satırdaki sayılar yalnızca okunabilirliğe yardımcı olmak içindir; her bir alt ifade için referans noktalarını gösterirler (yani, her bir çift parantez).
http://74.125.226.70
ve bunun nasıl çalıştığını bana bildirin :)