Nếu bạn muốn phân tích một URL, sử dụng java.net.URI
. java.net.URL
có một loạt các vấn đề - equals
phương pháp của nó thực hiện tra cứu DNS, có nghĩa là mã sử dụng nó có thể dễ bị từ chối các cuộc tấn công dịch vụ khi được sử dụng với các đầu vào không tin cậy.
"Ông Gosling - tại sao bạn làm cho url bằng hút?" giải thích một vấn đề như vậy Chỉ cần có thói quen sử dụng java.net.URI
thay thế.
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;
}
nên làm những gì bạn muốn
Mặc dù nó có vẻ hoạt động tốt, nhưng có cách tiếp cận nào tốt hơn hoặc có một số trường hợp cạnh, điều đó có thể thất bại.
Mã của bạn dưới dạng văn bản không thành công cho các URL hợp lệ:
httpfoo/bar
- URL tương đối với một thành phần đường dẫn bắt đầu bằng http
.
HTTP://example.com/
- giao thức không phân biệt chữ hoa chữ thường.
//example.com/
- giao thức URL tương đối với một máy chủ
www/foo
- một URL tương đối có thành phần đường dẫn bắt đầu bằng www
wwwexample.com
- tên miền không bắt đầu bằng www.
nhưng bắt đầu bằng www
.
URL phân cấp có ngữ pháp phức tạp. Nếu bạn cố gắng cuộn trình phân tích cú pháp của riêng mình mà không đọc kỹ RFC 3986, có thể bạn sẽ hiểu sai. Chỉ cần sử dụng cái được tích hợp vào thư viện lõi.
Nếu bạn thực sự cần phải xử lý các đầu vào lộn xộn java.net.URI
từ chối, hãy xem RFC 3986 Phụ lục B:
Phụ lục B. Phân tích tham chiếu URI bằng biểu thức chính quy
Vì thuật toán "thắng trận đầu tiên" giống hệt với phương pháp định hướng "tham lam" được sử dụng bởi các biểu thức chính quy POSIX, nên việc sử dụng một biểu thức chính quy để phân tích năm thành phần tiềm năng của tham chiếu URI là điều tự nhiên và phổ biến.
Dòng sau đây là biểu thức chính quy để chia nhỏ tham chiếu URI được định dạng tốt thành các thành phần của nó.
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
12 3 4 5 6 7 8 9
Các số trong dòng thứ hai ở trên chỉ để hỗ trợ khả năng đọc; chúng chỉ ra các điểm tham chiếu cho mỗi biểu thức con (nghĩa là mỗi dấu ngoặc đơn được ghép nối).
http://74.125.226.70
và cho tôi biết làm thế nào nó hoạt động :)