Java에서 유효한 URL을 확인하는 방법은 무엇입니까?
URL이 Java에서 유효한지 확인하는 가장 좋은 방법은 무엇입니까?
을 호출 new URL(urlString)
하고 잡으려고 MalformedURLException
했지만으로 시작하는 모든 것에 만족하는 것 같습니다 http://
.
나는 연결을 설정하는 것에 대해 걱정하지 않고 단지 타당성을 유지합니다. 이것에 대한 방법이 있습니까? Hibernate Validator의 주석? 정규식을 사용해야합니까?
편집 : 허용되는 URL의 몇 가지 예는 http://***
및 http://my favorite site!
입니다.
Apache Commons UrlValidator 클래스 사용 고려
UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid("http://my favorite site!");
이 클래스의 작동 방식을 제어하기 위해 설정할 수있는 몇 가지 속성이 있습니다. 기본적 http
으로 https
, 및 ftp
허용됩니다.
여기 내가 시도하고 유용하다고 생각한 방법이 있습니다.
URL u = new URL(name); // this would check for the protocol
u.toURI(); // does the extra checking required for validation of URI
Tendayi Mawushe의 답변에 대한 의견으로 이것을 게시하고 싶지만 공간이 충분하지 않은 것 같습니다.)
이것은 Apache Commons UrlValidator 소스 의 관련 부분입니다 .
/**
* This expression derived/taken from the BNF for URI (RFC2396).
*/
private static final String URL_PATTERN =
"/^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/";
// 12 3 4 5 6 7 8 9
/**
* Schema/Protocol (ie. http:, ftp:, file:, etc).
*/
private static final int PARSE_URL_SCHEME = 2;
/**
* Includes hostname/ip and port number.
*/
private static final int PARSE_URL_AUTHORITY = 4;
private static final int PARSE_URL_PATH = 5;
private static final int PARSE_URL_QUERY = 7;
private static final int PARSE_URL_FRAGMENT = 9;
거기에서 자신의 유효성 검사기를 쉽게 만들 수 있습니다.
외부 라이브러리없이 내가 가장 좋아하는 접근 방식 :
try {
URI uri = new URI(name);
// perform checks for scheme, authority, host, etc., based on your requirements
if ("mailto".equals(uri.getScheme()) {/*Code*/}
if (uri.getHost() == null) {/*Code*/}
} catch (URISyntaxException e) {
}
가장 "완벽한"방법은 URL의 가용성을 확인하는 것입니다.
public boolean isURL(String url) {
try {
(new java.net.URL(url)).openStream().close();
return true;
} catch (Exception ex) { }
return false;
}
유효성 검사기 패키지 :
UrlUtil이라는 Yonatan Matalon 의 멋진 패키지 가있는 것 같습니다 . API 인용 :
isValidWebPageAddress(java.lang.String address, boolean validateSyntax,
boolean validateExistance)
Checks if the given address is a valid web page address.
썬의 접근 방식-네트워크 주소 확인
Sun의 Java 사이트는 URL 확인 을위한 솔루션으로 연결 시도를 제공 합니다.
기타 정규식 코드 스 니펫 :
There are regex validation attempts at Oracle's site and weberdev.com.
Judging by the source code for URI
, the
public URL(URL context, String spec, URLStreamHandler handler)
constructor does more validation than the other constructors. You might try that one, but YMMV.
I didn't like any of the implementations (because they use a Regex which is an expensive operation, or a library which is an overkill if you only need one method), so I ended up using the java.net.URI class with some extra checks, and limiting the protocols to: http, https, file, ftp, mailto, news, urn.
And yes, catching exceptions can be an expensive operation, but probably not as bad as Regular Expressions:
final static Set<String> protocols, protocolsWithHost;
static {
protocolsWithHost = new HashSet<String>(
Arrays.asList( new String[]{ "file", "ftp", "http", "https" } )
);
protocols = new HashSet<String>(
Arrays.asList( new String[]{ "mailto", "news", "urn" } )
);
protocols.addAll(protocolsWithHost);
}
public static boolean isURI(String str) {
int colon = str.indexOf(':');
if (colon < 3) return false;
String proto = str.substring(0, colon).toLowerCase();
if (!protocols.contains(proto)) return false;
try {
URI uri = new URI(str);
if (protocolsWithHost.contains(proto)) {
if (uri.getHost() == null) return false;
String path = uri.getPath();
if (path != null) {
for (int i=path.length()-1; i >= 0; i--) {
if ("?<>:*|\"".indexOf( path.charAt(i) ) > -1)
return false;
}
}
}
return true;
} catch ( Exception ex ) {}
return false;
}
참고URL : https://stackoverflow.com/questions/2230676/how-to-check-for-a-valid-url-in-java
'programing' 카테고리의 다른 글
IFRAME에서 현재 URL 가져 오기 (0) | 2020.09.21 |
---|---|
ASP.NET MVC 작업에서 리퍼러 URL을 얻으려면 어떻게합니까? (0) | 2020.09.21 |
전체 에디터를 선택하지 않고 에이스 에디터의 값 설정 (0) | 2020.09.21 |
체크 아웃하지 않고 힘내 풀? (0) | 2020.09.21 |
intelliJ에 패키지가 존재하지 않습니다. (0) | 2020.09.21 |