জাভাতে ইউআরএল বৈধকরণ


103

আমি জানতে চেয়েছিলাম যে প্রদত্ত ইউআরএলটি যাচাই করার জন্য জাভাতে কোনও স্ট্যান্ডার্ড এপিআই রয়েছে কিনা? আমি উভয়ই ইউআরএল স্ট্রিং সঠিক কিনা অর্থাত প্রদত্ত প্রোটোকলটি বৈধ কিনা তা পরীক্ষা করে দেখতে চাই এবং তারপরে কোনও সংযোগ স্থাপন করা যায় কিনা তা পরীক্ষা করতে চাই।

আমি এইচটিএলপিআরএল সংযোগটি ব্যবহার করার চেষ্টা করেছি, ইউআরএল সরবরাহ করছি এবং এর সাথে সংযোগ স্থাপন করব। আমার প্রয়োজনীয়তার প্রথম অংশটি সম্পূর্ণ হয়ে গেছে বলে মনে হচ্ছে তবে যখন আমি HttpURLConnication.connect () সম্পাদন করার চেষ্টা করব, তখন 'java.net.ConnectException: সংযোগ প্রত্যাখ্যান' ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে।

প্রক্সি সেটিংসের কারণে এটি কি হতে পারে? আমি প্রক্সি জন্য সিস্টেম বৈশিষ্ট্য সেট করার চেষ্টা করেছি কিন্তু কোন সাফল্য নেই।

আমি কী ভুল করছি তা আমাকে জানান।


2
এখানে 2 টি প্রশ্ন আছে বলে মনে হয়; ইউআরএল বৈধতা এবং একটি কানেক্টেক্সেকশনের কারণ সন্ধান করা
বেন জেমস

যেহেতু এটিই প্রথম গুগল হিট java url validatorতাই এখানে অবশ্যই প্রশ্নগুলি রয়েছে, ইউআরএলকে কীভাবে বৈধতা দেওয়া যায় (স্ট্রিংটি দেখে) এবং ইউআরএলটি কীভাবে পৌঁছানো যায় তা পরীক্ষা করা যায় (উদাহরণস্বরূপ, কোনও HTTP সংযোগের মাধ্যমে)।
ভাইকিংস্টিভ

উত্তর:


157

সম্প্রদায়ের সুবিধার জন্য, যেহেতু
" ইউআরএল ভ্যালিডেটার জাভা " অনুসন্ধান করার সময় এই থ্রেডটি গুগলে শীর্ষে রয়েছে


ব্যতিক্রম ধরা ব্যয়বহুল, এবং সম্ভব হলে এড়ানো উচিত। যদি আপনি কেবল আপনার স্ট্রিংটি একটি বৈধ URL হিসাবে যাচাই করতে চান তবে আপনি অ্যাপাচি কমন্স ভ্যালিডেটর প্রকল্প থেকে ইউআরএলভালিডেটর শ্রেণিটি ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

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");
}

37
সেই URLValidator শ্রেণি অবহ্রাসিত হিসাবে চিহ্নিত হয়েছে। প্রস্তাবিত ইউআরএল ভিডিএটারটি রুটিন প্যাকেজে রয়েছে: Commons.apache.org/omotator/apidocs/org/apache/commons/…
স্পেকট্রর

6
@ স্পেকটার আমি লিঙ্কটি ঠিক করেছি। ধন্যবাদ।
যোনাতন

18
আমি এটি কীভাবে স্ট্যান্ডার্ড এপিআই
b1nary.atr0phy

2
আরআরভালিডিয়েটারের নিজস্ব সম্যক সমস্যাগুলির সেট রয়েছে। এমন কোনও বিকল্প লাইব্রেরি কি আরও সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হচ্ছে?
অ্যালেক্স আভারবুচ

9
@ অ্যালেক্সএভারবুচ: আপনি কি ইউআরএলভিলেডেটারের সাথে কী সমস্যাগুলি রূপরেখা দিতে পারেন? এটি বিদ্যমান বলে কেবল তাদের উপস্থিতি বলার অপেক্ষা রাখে না তবে তারা কী তা বলে না।
সিডিএমকেয়ে

33

আপনাকে একটি URLঅবজেক্ট এবং অবজেক্ট উভয়ই তৈরি করতে হবে URLConnection। নিম্নলিখিত কোডটি ইউআরএলের ফর্ম্যাট এবং কোনও সংযোগ স্থাপন করা যায় কিনা উভয়ই তা পরীক্ষা করে দেখবে:

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
}

দ্রষ্টব্য url / সমস্যাগুলি পরীক্ষা করার একাধিক উপায় রয়েছে Note উদাহরণস্বরূপ, আপনি যদি আপনার ইউআরএলটি একটির জন্য ব্যবহার করেন new HttpGet(url)তবে IllegalArgumentException HttpGet(...)কোনও ত্রুটিযুক্ত url থাকলে আপনি থ্রোগুলি ধরতে পারেন। এবং HttpResponseযদি ডেটা পেতে কোনও সমস্যা হয় তবে আপনাকে স্টাফও নিক্ষেপ করবে।
পিটার আজতাই

2
সংযোগ কেবল হোস্টের প্রাপ্যতা বৈধ করে। ইউআরএলটির বৈধতার সাথে কিছু করার নেই।
আন্দ্রে রদিওনোভ

2
কোনও ইউআরএলটির বৈধ ফর্ম পরীক্ষা করার জন্য দূষিত ইউরএলসেপশন নিরাপদ কৌশল নয়। এই উত্তরটি বিভ্রান্তিকর।
মার্টিন

1
@ মার্টিন: আপনি কেন এটি নিরাপদ নয় তা ব্যাখ্যা করতে পারেন ?
জেরোইন ভেনেভেল

28
এটি খুব, খুব ব্যয়বহুল। ওপেন সংযোগ / সংযুক্তিটি আসলে সংস্থার সাথে সংযোগ করার চেষ্টা করবে to ইউআরএল যাচাই করার জন্য এটি অবশ্যই সবচেয়ে ব্যয়বহুল উপায় হতে পারে।
গ্লেন বেচ

33

java.net.URLবর্গ না এ সব URL গুলি যাচাই এটি একটি দুর্দান্ত উপায় আসলে নেই। নির্মাণের সময় সমস্ত ত্রুটিযুক্ত ইউআরএল নিক্ষেপ করা MalformedURLExceptionহয় না । আকর্ষণীয় 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();
    }

.. যে কোনও ব্যতিক্রম ছুঁড়ে না।

আমি প্রাসঙ্গিক মুক্ত ব্যাকরণ ব্যবহার করে প্রয়োগ করা কিছু বৈধতা এপিআই ব্যবহার করার পরামর্শ দিই বা খুব সরলীকৃত বৈধতায় কেবল নিয়মিত অভিব্যক্তি ব্যবহার করি। তবে এর জন্য একটি উচ্চতর বা স্ট্যান্ডার্ড এপিআইয়ের পরামর্শ দেওয়ার জন্য আমার কারও প্রয়োজন, আমি সম্প্রতি এটি নিজেই অনুসন্ধান শুরু করেছি।

দ্রষ্টব্য এটি পরামর্শ দেওয়া হয়েছে যে URL#toURI()ব্যতিক্রমগুলি পরিচালনা করার সাথে java.net. URISyntaxExceptionএকত্রিত হয়ে ইউআরএলগুলির বৈধতা সরবরাহ করতে পারে। যাইহোক, এই পদ্ধতিটি কেবল উপরের একটি খুব সাধারণ কেস ধরে।

উপসংহারটি হল যে URL গুলি বৈধ করার জন্য কোনও মানক জাভা URL পার্সার নেই URL


আপনি কি এই সমস্যার সমাধান খুঁজে পেয়েছেন ??
kidd0

@ bi0s.kidd0 এখানে বেশ কয়েকটি লাইব্রেরি ব্যবহার করা যেতে পারে তবে আমরা আমাদের নিজস্ব রোল করার সিদ্ধান্ত নিয়েছি। এটি সম্পূর্ণ নয়, তবে ডোমেন বা আইপি (উভয়ই v4 এবং v6) সহ ইউআরএল সহ আমরা কী আগ্রহী তা পার্স করতে পারি। github.com/jajja/arachne
মার্টিন

15

কেবলমাত্র স্ট্যান্ডার্ড এপিআই ব্যবহার করে স্ট্রিংটিকে কোনও URLঅবজেক্টে পাস করুন এবং তারপরে এটিকে কোনও URIবস্তুতে রূপান্তর করুন । এটি আরএফসি 2396 স্ট্যান্ডার্ড অনুযায়ী ইউআরএলের বৈধতা নির্ভুলভাবে নির্ধারণ করবে।

উদাহরণ:

public boolean isValidURL(String url) {

    try {
        new URL(url).toURI();
    } catch (MalformedURLException | URISyntaxException e) {
        return false;
    }

    return true;
}

5
নোট করুন যে এই স্ট্রিং-> url-> ইউরি বৈধকরণ স্কিম রিপোর্ট করে যে এই পরীক্ষার কেসগুলি বৈধ: "http: //.com" " কম ।" "ftp: // :::: @ example.com" "http: /test.com" "" http: test.com "" http: /: "সুতরাং এটি স্ট্যান্ডার্ড এপিআই থাকাকালীন, এটি প্রয়োগ করার বৈধতা বিধিগুলি নাও হতে পারে একজন কী আশা করে
ডেভেক

10

android.webkit.URLUtilঅ্যান্ড্রয়েড ব্যবহার করুন:

URLUtil.isValidUrl(URL_STRING);

দ্রষ্টব্য: এটি কেবল URL টির প্রাথমিক স্কিমটি পরীক্ষা করছে, পুরো URL টি বৈধ নয়।


2
আপনি যদি অ্যান্ড্রয়েড অ্যাপ্লিকেশন অফ কোর্সে কাজ করে থাকেন তবেই।
miva2

8

তৃতীয় পক্ষের লাইব্রেরিগুলিকে অবলম্বন না করে জাভাতে মানদণ্ডের সাথে কঠোর অনুসারে ইউআরএল বৈধতা দেওয়ার উপায় রয়েছে:

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

প্রস্ততকর্তার URIচেক যে urlএকটি বৈধ কোনো URI, এবং কল parseServerAuthorityনিশ্চিত করে যে এটা একটি URL (পূর্ণ অথবা আপেক্ষিক) এবং না একটি ভস্মাধার হয়।


ব্যতিক্রমটি নিক্ষেপ করা হয়েছে "যদি এই ইউআরআইয়ের কর্তৃপক্ষের উপাদানটি সংজ্ঞায়িত করা হয় তবে আরএফসি 2396 অনুযায়ী সার্ভার ভিত্তিক কর্তৃপক্ষ হিসাবে পার্স করা যায় না"। যদিও এটি অন্যান্য বেশিরভাগ প্রস্তাবের চেয়ে অনেক ভাল, এটি কোনও ইউআরএলকে বৈধতা দিতে পারে না।
মার্টিন

@ মার্টিন, আপনি কনস্ট্রাক্টরের বৈধতার কথা ভুলে গেছেন। আমি যেমন লিখেছি, URIকনস্ট্রাক্টর কল এবং কলটির সংমিশ্রণটি একা parseServerAuthorityনয়, ইউআরএলকে বৈধতা দেয় parseServerAuthority
dened

1
আপনি এই পৃষ্ঠায় এমন উদাহরণগুলি সন্ধান করতে পারেন যা আপনার পরামর্শ অনুসারে ভুলভাবে বৈধ হয়েছে। ডকুমেন্টেশন দেখুন, এবং এটি আপনার উদ্দেশ্য ব্যবহারের জন্য ডিজাইন করা না হলে দয়া করে এটি কাজে লাগানোর প্রচার করবেন না।
মার্টিন

@ মার্টিন, আপনি কি আরও নির্দিষ্ট হতে পারেন? আপনার মতে কোন উদাহরণগুলি এই পদ্ধতি দ্বারা ভুলভাবে বৈধ হয়েছে?

1
@ আসু হ্যাঁ দ্বিতীয় ://হোস্টের পরে আসে, :পোর্ট নম্বরটি প্রবর্তন করে, যা সিনট্যাক্স অনুসারে খালি থাকতে পারে। //খালি খণ্ড সহ পথের একটি অংশ, যা বৈধ। আপনি যদি নিজের ব্রাউজারে এই ঠিকানাটি প্রবেশ করেন এটি এটি খোলার চেষ্টা করবে (তবে সম্ভবত সার্ভারটির নাম খুঁজে পাবে না https;))।
15:

2

ইউআরএল অবজেক্ট বৈধতা এবং সংযোগ উভয়ই হ্যান্ডেল করে তা উল্লেখ করা কেবল গুরুত্বপূর্ণ। তারপর, শুধুমাত্র প্রোটোকল, যার জন্য হ্যান্ডলার সরবরাহ করা হয়েছে sun.net.www.protocol অনুমোদিত হয় ( ফাইল , FTP , গোফার , HTTP , HTTPS , বয়াম , mailto , netdoc ) বৈধ বেশী। উদাহরণস্বরূপ, ldap প্রোটোকল দিয়ে একটি নতুন URL তৈরি করার চেষ্টা করুন :

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

আপনি একটি পাবেন java.net.MalformedURLException: unknown protocol: ldap

আপনার নিজের হ্যান্ডলারটি প্রয়োগ করতে হবে এবং এটির মাধ্যমে নিবন্ধন করতে হবে URL.setURLStreamHandlerFactory()। আপনি যদি ইউআরএল সিন্ট্যাক্সকে বৈধতা দিতে চান তবে বেশিরভাগ ওভারকিল, একটি রেজিএক্সপক্স একটি সহজ সমাধান বলে মনে হচ্ছে।


1

আপনি কি সিস্টেমের বৈশিষ্ট্য হিসাবে সঠিক প্রক্সিটি ব্যবহার করছেন তা নিশ্চিত?

এছাড়াও আপনি যদি 1.5 বা 1.6 ব্যবহার করেন তবে আপনি java.net.Proxy উদাহরণটি ওপেন সংযোগ () পদ্ধতিতে পাস করতে পারেন। এটি আরও মার্জিত ইমো:

//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 এর জন্য কাজ করে না।
মার্টিন

0

আমি মনে করি ব্যবহারকারী @ b1nary.atr0phy এর সেরা প্রতিক্রিয়া। যাইহোক, আমি সম্ভাব্য সমস্ত কেস কভার করতে একটি রেজেক্সের সাথে b1nay.atr0phy প্রতিক্রিয়া থেকে পদ্ধতিটি একত্রিত করার পরামর্শ দিচ্ছি।

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;  

    }

1
এই রেজেক্সের সাথে বেশ কয়েকটি সমস্যা রয়েছে: ১. প্রিফিক্স ব্যতীত ইউআরএলগুলি অবৈধ, (যেমন "স্ট্যাকওভারফ্লো ডটকম"), এটি প্রিফিক্সটি অনুপস্থিত থাকলে দু'টি প্রত্যয় সহ ইউআরএল অন্তর্ভুক্ত করে (উদাহরণস্বরূপ "amazon.co.uk ")। ২. আইপিগুলি সর্বদা অবৈধ (যেমন " 127.0.0.1" ), তারা উপসর্গটি ব্যবহার করে বা না তা বিবেচনা করে না। আমি "((http|https|ftp)://)?((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+"( উত্স ) ব্যবহার করার পরামর্শ দিই । এই রেজেক্সের একমাত্র নেতিবাচকতা হ'ল উদাহরণস্বরূপ "127.0..0.1" এবং "127.0" বৈধ।
নেফ

-2

ধন্যবাদ। নিকডকে প্রস্তাবিত প্রক্সি পাস করে ইউআরএল সংযোগটি খোলার কাজটি ভাল কাজ করে।

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

সিস্টেম বৈশিষ্ট্যগুলি যেমন কাজ করে না যেমন আমি আগেই বলেছি।

আবার ধন্যবাদ.

শুভেচ্ছা, কেয়া

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.