Java에서 URL을 검증하는 중
특정 URL을 검증하기 위한 표준 API가 Java에 있는지 알고 싶습니다. URL 문자열이 유효한지, 즉 특정 프로토콜이 유효한지 확인하고 연결을 설정할 수 있는지 확인합니다.
나는 Http를 사용해 보았다.URL 연결: URL을 제공하고 URL에 연결합니다.처음 요구 사항은 충족된 것 같지만 Http를 실행하려고 하면URL Connection.connect() , 'java.net.Connect Exception:Connection rejected' 예외가 느려집니다.
프록시 설정 때문일까요?시스템 속성을 프록시로 설정하려고 했지만 실패했습니다.
제가 뭘 잘못하고 있는지 알려주세요.
이 시 시 사용할 수 .
"url validator java"
예외 포착은 비용이 많이 들기 때문에 가능하면 피해야 합니다.문자열이 유효한 URL인지 확인하려는 경우 Apache Commons Validator 프로젝트의 Url Validator 클래스를 사용할 수 있습니다.
예를 들어 다음과 같습니다.
String[] schemes = {"http","https"}; // DEFAULT schemes = "http", "https", "ftp"
UrlValidator urlValidator = new UrlValidator(schemes);
if (urlValidator.isValid("ftp://foo.bar.com/")) {
System.out.println("URL is valid");
} else {
System.out.println("URL is invalid");
}
java.net.URL
.class URL을 검증하다.MalformedURLException
는, 모든 부정한 형식의 URL 에 송신되지 않습니다.캐치IOException
java.net.URL#openConnection().connect()
.URL은검증되지 .접속이 확립될 수 있는지 아닌지만 알려 주세요.
다음 코드를 생각해 보십시오.
try {
new URL("http://.com");
new URL("http://com.");
new URL("http:// ");
new URL("ftp://::::@example.com");
} catch (MalformedURLException malformedURLException) {
malformedURLException.printStackTrace();
}
..예외를 두지 않습니다.
문맥 자유 문법을 사용하여 구현된 검증 API를 사용하거나 매우 간단한 검증에서는 정규 표현만 사용할 것을 권장합니다.하지만 저는 이것을 위해 상위 API나 표준 API를 제안해 줄 사람이 필요합니다.제가 직접 찾기 시작한 것은 얼마 전입니다.
주의:URL#toURI()
java.net. URISyntaxException
는, 의 하게 할 수 있습니다.그러나 이 방법은 위의 매우 간단한 사례 중 하나만을 포착합니다.
결론적으로 URL을 검증하는 표준 Java URL 파서는 없습니다.
다 요.URL
와 aURLConnection
는, 의 할 수 있는지를 .다음 코드는 URL 형식과 연결 확립 여부를 모두 테스트합니다.
try {
URL url = new URL("http://www.yoursite.com/");
URLConnection conn = url.openConnection();
conn.connect();
} catch (MalformedURLException e) {
// the URL is not in a valid form
} catch (IOException e) {
// the connection couldn't be established
}
표준 API만 사용하여 문자열을 에 전달합니다.URL
다음으로 오브젝트를 변환합니다.URI
표준에 합니다.이것에 의해, RFC 2396 표준에 따라서 URL 의 유효성이 정확하게 판단됩니다.
예:
public boolean isValidURL(String url) {
try {
new URL(url).toURI();
} catch (MalformedURLException | URISyntaxException e) {
return false;
}
return true;
}
를 사용합니다.android.webkit.URLUtil
Android의 경우:
URLUtil.isValidUrl(URL_STRING);
주의: URL 의 초기 스킴을 확인하는 것 뿐, URL 전체가 유효한 것은 아닙니다.
서드파티 라이브러리에 의존하지 않고 Java 표준에 따라 URL 검증을 수행할 수 있는 방법이 있습니다.
boolean isValidURL(String url) {
try {
new URI(url).parseServerAuthority();
return true;
} catch (URISyntaxException e) {
return false;
}
}
의 작성자URI
체크하다url
유효한 URI이며, 에의 콜parseServerAuthority
는 URL(절대 또는 상대)이며 URN이 아님을 확인합니다.
URL 객체가 검증과 접속을 모두 처리한다는 점을 지적하는 것이 중요합니다.sun.net.www.doc에서 핸들러가 제공된 프로토콜만 유효합니다(file, ftp, gopher, http, https, jar, mailto, netdoc).예를 들어 ldap 프로토콜을 사용하여 새 URL을 만듭니다.
new URL("ldap://myhost:389")
당신은 그것을 얻을 것입니다.java.net.MalformedURLException: unknown protocol: ldap
.
자체 핸들러를 구현하고 를 통해 등록해야 합니다.URL.setURLStreamHandlerFactory()
URL 구문만 검증하고 싶다면 regexp가 더 간단한 솔루션인 것 같습니다.
올바른 프록시를 시스템 속성으로 사용하시겠습니까?
또, 1.5 또는 1.6 를 사용하고 있는 경우는, java.net 에 패스 할 수 있습니다.openConnection() 메서드에 대한 프록시 인스턴스.이게 더 우아한 IMO입니다.
//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);
가장 좋은 답변은 user@b1nary.atr0phy라고 생각합니다.어떻게든 b1nay.atr0phy 응답의 방법을 regex와 결합하여 가능한 모든 경우를 커버할 것을 권장합니다.
public static final URL validateURL(String url, Logger logger) {
URL u = null;
try {
Pattern regex = Pattern.compile("(?i)^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))\\.?)(?::\\d{2,5})?(?:[/?#]\\S*)?$");
Matcher matcher = regex.matcher(url);
if(!matcher.find()) {
throw new URISyntaxException(url, "La url no está formada correctamente.");
}
u = new URL(url);
u.toURI();
} catch (MalformedURLException e) {
logger.error("La url no está formada correctamente.");
} catch (URISyntaxException e) {
logger.error("La url no está formada correctamente.");
}
return u;
}
이것은 CDN URL 검증에 사용하는 것입니다(Https로 시작해야 하지만 커스터마이즈하기 쉽습니다).또, IP 주소의 사용도 허가되지 않습니다.
public static final boolean validateURL(String url) {
var regex = Pattern.compile("^[https:\\/\\/(www\\.)?a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)");
var matcher = regex.matcher(url);
return matcher.find();
}
감사합니다. NickDK의 제안대로 Proxy를 전달하여 URL 연결을 열 수 있습니다.
//Proxy instance, proxy ip = 10.0.0.1 with port 8080
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.0.0.1", 8080));
conn = new URL(urlString).openConnection(proxy);
그러나 시스템 속성은 앞에서 설명한 대로 작동하지 않습니다.
다시한번 감사합니다.
안부 전해 주세요, 케야
언급URL : https://stackoverflow.com/questions/1600291/validating-url-in-java
'programing' 카테고리의 다른 글
Maria를 사용하여 클러스터 쿼츠를 적절하게 구성하는 방법DB (0) | 2022.10.03 |
---|---|
어떤 'php.ini' 파일이 사용되고 있는지 어떻게 알 수 있습니까? (0) | 2022.10.03 |
Simple Test vs PHPunit (0) | 2022.10.02 |
문자열로 PHP 클래스 속성 가져오기 (0) | 2022.10.02 |
MySql Select 쿼리에서 UTC 날짜를 로컬 시간대로 변환하는 방법 (0) | 2022.10.02 |