programing

Java에서 URL을 검증하는 중

yoursource 2022. 10. 2. 12:29
반응형

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 에 송신되지 않습니다.캐치IOExceptionjava.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.URLUtilAndroid의 경우:

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

반응형