web-dev-qa-db-ja.com

JavaのURLの検証

特定のURLを検証するためのJavaに標準APIがあるかどうかを知りたいですか? URL文字列が正しいかどうか、つまり指定されたプロトコルが有効かどうか、および接続を確立できるかどうかの両方を確認したいと思います。

HttpURLConnectionを使用して、URLを提供して接続しました。要件の最初の部分は満たされているようですが、HttpURLConnection.connect()を実行しようとすると、「Java.net.ConnectException:Connection refused」例外がスローされます。

これはプロキシ設定が原因である可能性がありますか?プロキシのシステムプロパティを設定しようとしましたが、成功しませんでした。

私が間違っていることを教えてください。

95
Keya

コミュニティの利益のために、このスレッドは検索時にGoogleのトップです
"url Validator Java"


例外をキャッチするのは費用がかかるため、可能な場合は避ける必要があります。文字列が有効なURLであることを確認したい場合は、 UrlValidatorApache Commons 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");
}
140
Yonatan

URLオブジェクトとURLConnectionオブジェクトの両方を作成する必要があります。次のコードは、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
}
36
Olly

Java.net.URLクラスは、実際にはURLを検証する良い方法ではありません。 MalformedURLExceptionは、構築中にすべての不正なURLでnotにスローされます。 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を提案してくれる人が必要です。最近自分で検索を始めたばかりです。

例外処理Java.net. URISyntaxExceptionと組み合わせてURL#toURI()を使用すると、URLの検証が容易になることが示唆されています。ただし、このメソッドは上記の非常に単純なケースの1つだけをキャッチします。

結論は、URLを検証する標準のJava URLパーサーは存在しないということです。

31
Martin

only標準APIを使用して、文字列をURLオブジェクトに渡し、それをURIオブジェクトに変換します。これにより、RFC2396標準に従ってURLの有効性が正確に判断されます。

例:

public boolean isValidURL(String url) {  

    URL u = null;

    try {  
        u = new URL(url);  
    } catch (MalformedURLException e) {  
        return false;  
    }

    try {  
        u.toURI();  
    } catch (URISyntaxException e) {  
        return false;  
    }  

    return true;  
} 
11
b1nary.atr0phy

AndroidでAndroid.webkit.URLUtilを使用します。

URLUtil.isValidUrl(URL_STRING);

注:URL全体が有効であることではなく、URLの初期スキームを確認するだけです。

8
penduDev

サードパーティのライブラリに頼ることなく、Javaの標準に厳密に従ってURL検証を実行する方法があります。

boolean isValidURL(String url) {
  try {
    new URI(url).parseServerAuthority();
    return true;
  } catch (URISyntaxException e) {
    return false;
  }
}

URIのコンストラクターは、urlが有効なURIであることを確認し、parseServerAuthorityの呼び出しにより、それがURL(絶対または相対)でありURNではないことを確認します。

5
dened

URLオブジェクトが検証と接続の両方を処理することを指摘するだけで重要です。次に、Sun.net.www.protocolでハンドラーが提供されているプロトコルのみが許可されます(fileftpGopherhttphttpsjarmailtonetdoc )は有効なものです。たとえば、ldapプロトコルを使用して新しいURLを作成してみます。

new URL("ldap://myhost:389")

Java.net.MalformedURLException: unknown protocol: ldapを取得します。

独自のハンドラを実装し、URL.setURLStreamHandlerFactory()を介して登録する必要があります。 URL構文を検証したいだけの場合はかなりやり過ぎです。正規表現はより簡単なソリューションのようです。

2
PomCompot

システムプロパティとして正しいプロキシを使用しているのですか?

また、1.5または1.6を使用している場合、Java.net.ProxyインスタンスをopenConnection()メソッドに渡すことができます。これはよりエレガントなです:

//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);
1
NickDK