আমি কেন জিইটি অনুরোধের পরিবর্তে একটি বিকল্পের অনুরোধ পাচ্ছি?


287
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
     alert(data);
});
</script>

এটি সেই ইউআরএলটিতে একটি বিকল্প অনুরোধ করে এবং তারপরে কলব্যাক কখনও কোনও কিছুর সাথে কল হয় না।

যখন এটি ক্রস ডোমেন নয়, এটি দুর্দান্ত কাজ করে।

JQuery কি কেবল <script>নোড দিয়ে কল করা উচিত নয় এবং তারপরে লোড হওয়ার পরে কলব্যাক করা উচিত নয়? আমি বুঝতে পারি যে আমি ফলাফলটি পাব না (যেহেতু এটি ক্রস ডোমেন) তবে এটি ঠিক আছে; আমি কেবল কলটি পেরিয়ে যেতে চাই। এটি কি কোনও বাগ, বা আমি কিছু ভুল করছি?


2
ক্রস ডোমেনের কারণ হতে পারে। যেমন আপনি যদি নিজের ফাইল ফাইলটিতে থাকেন: // লোকালহোস্ট / ওয়েবেএসআইটি ব্যবহারের পরিবর্তে // PATH_TO_WEBSITE
জেমস 111

উত্তর:


261

এমডিএন অনুসারে ,

পূর্বনির্ধারিত অনুরোধ

সাধারণ অনুরোধগুলির বিপরীতে (উপরে আলোচনা করা হয়েছে) প্রকৃত অনুরোধটি প্রেরণে নিরাপদ কিনা তা নির্ধারণের জন্য, "পূর্বনির্ধারিত" অনুরোধগুলি প্রথমে অন্য ডোমেনের সংস্থানটিতে একটি HTTP বিকল্প বিকল্পের শিরোনাম প্রেরণ করে। ক্রস-সাইট অনুরোধগুলি এর মতো প্রাক-আলোকিত হয় যেহেতু তাদের ব্যবহারকারীর ডেটাতে অন্তর্ভুক্ত থাকতে পারে। বিশেষত, একটি অনুরোধ প্রাকফ্লাইট করা হয় যদি:

  • এটি জিইটি বা পোষ্ট ব্যতীত অন্য পদ্ধতি ব্যবহার করে। এছাড়াও, যদি POST অ্যাপ্লিকেশন / x-www-form-urlencoded, মাল্টিপার্ট / ফর্ম-ডেটা, বা পাঠ্য / প্লেইন ব্যতীত কোনও সামগ্রী-প্রকারের সাথে অনুরোধ ডেটা প্রেরণ করতে ব্যবহৃত হয়, যেমন যদি POST অনুরোধটি সার্ভারে একটি এক্সএমএল পেইড প্রেরণ করে অ্যাপ্লিকেশন / এক্সএমএল বা পাঠ্য / এক্সএমএল ব্যবহার করে, তারপরে অনুরোধটি পূর্বনির্ধারিত।
  • এটি অনুরোধে কাস্টম শিরোলেখ সেট করে (যেমন অনুরোধটি শিরোনাম ব্যবহার করে যেমন এক্স-পিংগথার)

43
এটি আমাদের সমস্যা সমাধান করেছে, "অ্যাপ্লিকেশন / জসন" থেকে "পাঠ্য / প্লেইন" এ পরিবর্তন করা ভয়ঙ্কর বিকল্পগুলির অনুরোধটি বন্ধ করে দিয়েছে
কেইনো

10
আমি যা বুঝতে পারি না তা হ'ল আসল অনুরোধটি পাঠানো নিরাপদ কিনা তা পরীক্ষা করার জন্য ব্রাউজার কেন অপশন পদ্ধতিতে অনুরোধ করছে। কিন্তু কোন অর্থে? মানে সার্ভারও নির্দিষ্ট প্রতিক্রিয়া শিরোনামগুলির সাথে বিধিনিষেধ আরোপ করতে পারে তাই কেন এটি প্রয়োজন?
হার্ডিক

11
@ হার্দিক মনে রাখবেন যে সিওআরএস যুক্ত করে আপনি যে কারও কাছ থেকে সম্ভাব্যভাবে অনুরোধগুলি গ্রহণ করছেন, যাতে তারা আপনার সার্ভারে অনুরোধের মাধ্যমে ডেটা ম্যানিপুলেট করতে পারে (পোষ্ট, পুট, ডিলেট ইত্যাদি)। এই পরিস্থিতিতে, কাস্টম শিরোনাম ব্যবহার করার মতো, ব্রাউজারটি প্রথমে সার্ভারের সাথে যাচাই করে যে সার্ভারকে অনুরোধ প্রেরণের আগে সার্ভারকে অনুরোধটি প্রেরণ করার আগে এটি গ্রহণ করতে ইচ্ছুক আপনার ডেটাটির জন্য সত্যই বিপজ্জনক হতে পারে what's ব্রাউজারের পয়েন্টটি সম্ভবত সার্ভার সেগুলি গ্রহণ করতে না চাইলে সম্ভাব্য বৃহত পে-লোড প্রেরণ করছে, অতএব প্রাক-বিমানের বিকল্পগুলি চেক করুন।
ডেভিডনাইটনাইট

6
@ ডেভিডনাইটনাইট যদি সার্ভারে আপনার ডেটা প্রেরণ করা বিপজ্জনক হতে পারে, যার অর্থ সার্ভারের সাথে আপোস করা হতে পারে তবে অবশ্যই দূষিত সার্ভারটি আপনার বিকল্পগুলির অনুরোধটির "" অবশ্যই, এটি সমস্ত প্রেরণ করুন! "দিয়ে সাড়া দেবে! কীভাবে সুরক্ষা? (সত্য প্রশ্ন)
ম্যাট

3
"প্রিফলাইট অনুরোধগুলি কোনও সুরক্ষার জিনিস নয় Rather পরিবর্তে, তারা নিয়ম-নীতি পরিবর্তনকারী জিনিস" " -
প্রিফলাইট


9

আপনি যদি পোস্ট করার চেষ্টা করছেন

JSON.stringifyআপনার ফর্ম ডেটা নিশ্চিত করুন এবং হিসাবে প্রেরণ text/plain

<form id="my-form" onSubmit="return postMyFormData();">
    <input type="text" name="name" placeholder="Your Name" required>
    <input type="email" name="email" placeholder="Your Email" required>
    <input type="submit" value="Submit My Form">
</form>

function postMyFormData() {

    var formData = $('#my-form').serializeArray();
    formData = formData.reduce(function(obj, item) {
        obj[item.name] = item.value;
        return obj;
    }, {});
    formData = JSON.stringify(formData);

    $.ajax({
        type: "POST",
        url: "https://website.com/path",
        data: formData,
        success: function() { ... },
        dataType: "text",
        contentType : "text/plain"
    });
}

2

আমি বিশ্বাস করি না যে এই জাতীয় ইউআরএল দেওয়া হলে jQuery ঠিক স্বাভাবিকভাবেই একটি JSONP অনুরোধ করবে। এটি যাইহোক, একটি জেএসএনপি অনুরোধ করবে যখন আপনি বলবেন যে কলব্যাকের জন্য কী যুক্তি ব্যবহার করা উচিত:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
     alert(data);
});

এই আর্গুমেন্টটি (যা "জসনক্যালব্যাক" বলতে হয় না) ব্যবহার করার জন্য এটি সম্পূর্ণরূপে গ্রহনকারী স্ক্রিপ্টের উপর নির্ভর করে, সুতরাং এই ক্ষেত্রে ফাংশনটি কখনই ডাকা হবে না। তবে, যেহেতু আপনি বলেছেন যে আপনি কেবলমাত্র metaward.com এ স্ক্রিপ্টটি কার্যকর করতে চান, এটি এটি তৈরি করে।


আমার কলব্যাকটি কি এখনও অবহিত হবে যে স্ক্রিপ্ট উপাদানটি পুরোপুরি লোড হয়েছে? আমি কেবলমাত্র এটি নিশ্চিত করতে চাই যে আমি আপডেটটির জন্য এপিআইয়ের জিজ্ঞাসা করার আগেই হয়েছিল।
পল টারজান

আপনি যদি গ্রহণকারী স্ক্রিপ্টটি JSONP সমর্থন করে এবং আপনি চিহ্নিত ফাংশনটি কল করতে রাজি হন তবে আপনি তা করবেন। যদি স্ক্রিপ্টটি অন্য কোনও আচরণ ছাড়াই JSON ডেটা ব্লক উৎপন্ন করা ব্যতীত অন্য কিছু না করে, আপনি কখন এটি লোড হয়ে গেছে তা বলতে সক্ষম হবেন না। কখন এটি লোড হয়ে গেছে তা যদি বলা বাহুল্য হয় তবে আপনি নিজের সার্ভারে এমন একটি স্ক্রিপ্ট বাস্তবায়ন বিবেচনা করতে পারেন যা প্রক্সি হিসাবে কাজ করে।
ভোটিডিসিপল

1

প্রকৃতপক্ষে, ক্রস-ডোমেন এজেএক্স (এক্সএমএলএইচটিপি) অনুরোধগুলি সুরক্ষার কারণে অনুমোদিত নয় (ক্লায়েন্টের পক্ষ থেকে "সীমাবদ্ধ" ওয়েবপৃষ্ঠা আনার এবং এটি আবার সার্ভারে প্রেরণ সম্পর্কে চিন্তা করুন - এটি কোনও সুরক্ষা সমস্যা হবে)।

একমাত্র কর্মসূচি হ'ল কলব্যাক। এটি হ'ল: একটি নতুন স্ক্রিপ্ট অবজেক্ট তৈরি করা এবং শেষ প্রান্তের জাভাস্ক্রিপ্টের দিকে এসআরসি পয়েন্ট করা, যা জেএসওএন মানগুলির সাথে একটি কলব্যাক (আমার ফাংশন ({ডেটা})), মাই ফাংশন এমন একটি ফাংশন যা ডেটা দিয়ে কিছু করে (উদাহরণস্বরূপ, এটি সংরক্ষণ করে) একটি পরিবর্তনশীল)।


1
ঠিক আছে, তবে আমি এটি <স্ক্রিপ্ট src = ""> বা <img src = ""> এ লোড করতে পারি এবং ব্রাউজারটি আনন্দের সাথে এটি আঘাত করবে। আমি কখন এটি পুরোপুরি লোড হয় তা জানতে চাই যাতে আমি আমদানির ফলাফলের জন্য জিজ্ঞাসা করতে পারি।
পল টারজান

1

কেবল "অ্যাপ্লিকেশন / জসন" কে "পাঠ্য / প্লেইন" এ পরিবর্তন করুন এবং JSON.stringify (অনুরোধ) ভুলে যাবেন না:

var request = {Company: sapws.dbName, UserName: username, Password: userpass};
    console.log(request);
    $.ajax({
        type: "POST",
        url: this.wsUrl + "/Login",
        contentType: "text/plain",
        data: JSON.stringify(request),

        crossDomain: true,
    });

1

আমারও একই সমস্যা ছিল। আমার ফিক্সটি হ'ল আমার পিএইচপি স্ক্রিপ্টে শিরোনাম যুক্ত করা ছিল যা কেবলমাত্র পরিবেশ পরিবেশে উপস্থিত থাকলে।

এটি ক্রস-ডোমেন অনুরোধগুলিকে মঞ্জুরি দেয়:

header("Access-Control-Allow-Origin: *");

এটি প্রিফলাইট অনুরোধটি জানিয়েছে যে ক্লায়েন্টের জন্য এটির যে কোনও শিরোনাম প্রেরণ করা ঠিক আছে:

header("Access-Control-Allow-Headers: *");

এইভাবে অনুরোধটি সংশোধন করার দরকার নেই।

আপনার ডেভ ডাটাবেসে যদি সংবেদনশীল ডেটা থাকে যা সম্ভাব্যভাবে ফাঁস হতে পারে, তবে আপনি এই সম্পর্কে দু'বার ভাবতে পারেন।


1

আমার ক্ষেত্রে, সমস্যাটি সিওআরএস সম্পর্কিত নয় যেহেতু আমি একই ওয়েব সার্ভারে একটি jQuery পোস্ট প্রদান করছিলাম P ডেটা জেএসএন ছিল তবে আমি ডেটা টাইপটি বাদ দিয়েছি: 'জসন' প্যারামিটার।

উপরের ডেভিড লোপসের উত্তরে দেখানো হয়েছে এমন কন্টেন্ট টাইপ প্যারামিটার আমার কাছে নেই (না আমিও করেছি)।


0

এটি ফায়ারফক্স এবং অপেরার মতো দেখাচ্ছে (ম্যাকের উপরও পরীক্ষিত) এটির ক্রস ডোমেনেস পছন্দ করেন না (তবে সাফারি এটির সাথে ভাল fine

দূরবর্তী পৃষ্ঠাটি কার্ল করার জন্য আপনাকে একটি স্থানীয় সার্ভার সাইড কোড কল করতে হতে পারে।


0

আমি নিম্নলিখিত শিরোনামগুলির সাহায্যে এটি ঠিক করতে সক্ষম হয়েছি

Access-Control-Allow-Origin
Access-Control-Allow-Headers
Access-Control-Allow-Credentials
Access-Control-Allow-Methods

আপনি যদি নোদেজে থাকেন তবে এখানে কোডটি আপনি অনুলিপি / পেস্ট করতে পারেন।

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin','*');
  res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, PATCH');
  next();
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.