$.ajax()
কোনও সাইটে লগ ইন করার পরে , আমি $.ajax()
সেই সাইটে দ্বিতীয় অনুরোধটি প্রেরণ করার চেষ্টা করছি - তবে যখন আমি ফায়ারব্যাগ ব্যবহার করে প্রেরিত শিরোনামগুলি পরীক্ষা করি তখন অনুরোধের সাথে সেশন কুকি অন্তর্ভুক্ত করা হয় না।
আমি কি ভুল করছি?
$.ajax()
কোনও সাইটে লগ ইন করার পরে , আমি $.ajax()
সেই সাইটে দ্বিতীয় অনুরোধটি প্রেরণ করার চেষ্টা করছি - তবে যখন আমি ফায়ারব্যাগ ব্যবহার করে প্রেরিত শিরোনামগুলি পরীক্ষা করি তখন অনুরোধের সাথে সেশন কুকি অন্তর্ভুক্ত করা হয় না।
আমি কি ভুল করছি?
উত্তর:
আপনি যে ইউআরএল কল করছেন তা যদি আপনার কলিং স্ক্রিপ্টের মতো একই ডোমেনে থাকে তবে এজ্যাক্স কেবলমাত্র কুকিজ প্রেরণ কল করে।
এটি ক্রস ডোমেন সমস্যা হতে পারে।
www.domain-a.com
আপনার কলিং স্ক্রিপ্টটি চালু থাকাকালীন থেকে আপনি url কল করার চেষ্টা করেছিলেন www.domain-b.com
(অন্য কথায়: আপনি একটি ক্রস ডোমেন কল করেছেন যাতে ব্রাউজার আপনার গোপনীয়তা সুরক্ষার জন্য কোনও কুকিজ প্রেরণ করে না)।
এক্ষেত্রে আপনার বিকল্পগুলি হ'ল:
খুশী যদি এটি আরও কিছুটা সহায়তা করে।
path=/something
রেখেছিলেন এবং আপনি পৃষ্ঠাটির জন্য অনুরোধ করছেন /another
তবে কুকি প্রেরণ হবে না। আপনি পৃষ্ঠাটি অনুরোধ করার /something
সময় কুকি প্রত্যাশিত হিসাবে প্রেরণ করা হবে। সুতরাং কোডটি যা কুকি সেট করে তাও পরীক্ষা করে দেখুন।
আমি ক্রস-ডোমেন দৃশ্যে পরিচালনা করছি। লগইন চলাকালীন রিমোট সার্ভার সেট- Access-Control-Allow-Credentials
সত্যের সাথে সেট -কুকির শিরোনামটি ফিরিয়ে দিচ্ছে।
রিমোট সার্ভারে পরবর্তী এজাক্স কলটিতে এই কুকিটি ব্যবহার করা উচিত।
Access-Control-Allow-Credentials
ক্রস-ডোমেন লগিংয়ের অনুমতি দেওয়ার জন্য সিওআরএস রয়েছে। উদাহরণের জন্য https://developer.mozilla.org/En/HTTP_access_control দেখুন ।
আমার কাছে এটি JQuery (বা অন্তত পরবর্তী সংস্করণে বৈশিষ্ট্যযুক্ত হতে হবে) এর মতো বাগের মতো মনে হচ্ছে।
হালনাগাদ:
AJAX প্রতিক্রিয়া থেকে কুকিজ স্বয়ংক্রিয়ভাবে সেট করা হয় না (উদ্ধৃতি: http://aleembawany.com/2006/11/14/anatomy-of-a-well-designed-ajax-login- অভিজ্ঞতা / )
কেন?
ম্যানুয়ালি সেট করার প্রতিক্রিয়া থেকে আপনি কুকির মান পেতে পারবেন না ( http://www.w3.org/TR/XMLHttpRequest/#dom-xMLhttprequest-getresponseheader )
আমি বিভ্রান্ত ..
প্যারামিটার jquery.ajax()
সেট করতে বলার উপায় থাকতে পারে XMLHttpRequest.withCredentials = "true"
।
উত্তর:
আপনার http://api.jquery.com/jQuery.ajax/xhrFields
এর প্যারাম ব্যবহার করা উচিত
ডকুমেন্টেশনের উদাহরণটি হ'ল:
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
সার্ভার এই অনুরোধটির সঠিক উত্তর দেয় তাও গুরুত্বপূর্ণ। @ ফ্রিডরিক এবং @ পেবলের দুর্দান্ত মন্তব্যগুলি এখানে অনুলিপি করা হচ্ছে:
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
তাই যখন অনুরোধটি হয়:
Origin: http://foo.example
Cookie: pageAccess=2
সার্ভারের সাথে প্রতিক্রিয়া জানানো উচিত:
Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Credentials: true
[payload]
অন্যথায় পে-লোড স্ক্রিপ্টে ফিরে আসবে না। দেখুন: https://developer.mozilla.org/en-US/docs/Web/HTTP/Acecess_control_CORS# রিকুইয়েস্টস_সামান্য শংসাপত্র
Important note: when responding to a credentialed request, server must specify a domain, and cannot use wild carding. The above example would fail if the header was wildcarded as: Access-Control-Allow-Origin: *
ডেভেলপার.মোজিলা.আর.ইন-
ব্যবহার
xhrFields: { withCredentials:true }
আমার jQuery এর অংশ হিসাবে এজ্যাক্স কলটি কেবল সমাধানের অংশ ছিল। আমার সংস্থান থেকে বিকল্পগুলি প্রতিক্রিয়াতে আমার শিরোনামগুলি ফিরে আসা দরকার:
Access-Control-Allow-Origin : http://www.wombling.com
Access-Control-Allow-Credentials : true
এটি গুরুত্বপূর্ণ যে শুধুমাত্র ছিল এক মঞ্জুরিপ্রাপ্ত "উত্স" প্রতিক্রিয়া হেডারের মধ্যে ছিল পছন্দসমূহ কল এবং না "*"। আমি অনুরোধটি থেকে উত্সটি পড়তে এবং এটি প্রতিক্রিয়াতে ফিরিয়ে এটিকে অর্জন করেছিলাম - সম্ভবত সীমাবদ্ধতার মূল কারণটিকে তুচ্ছ করে রেখেছি, তবে আমার ব্যবহারের ক্ষেত্রে সুরক্ষা সর্বোচ্চ নয়।
আমি ভেবেছিলাম এটি কেবলমাত্র একটি উত্সের প্রয়োজনীয়তার জন্য স্পষ্টভাবে উল্লেখ করা উপযুক্ত, কারণ ডাব্লু 3 সি স্ট্যান্ডার্ড কোনও স্থান পৃথকীকরণের তালিকার জন্য অনুমতি দেয় - তবে ক্রোম দেয় না! http://www.w3.org/TR/cors/#access-control-allow-origin-response-header NB "অনুশীলনে" বিট করুন।
এটি আপনার init ফাংশনে রাখুন:
$.ajaxSetup({
xhrFields: {
withCredentials: true
}
});
এটা কাজ করবে।
এই প্রশ্নের ইতিমধ্যে অনেক ভাল প্রতিক্রিয়া রয়েছে, তবে আমি ভেবেছিলাম যে আপনি যেখানে সেশন কুকি প্রেরণের প্রত্যাশা করবেন সে ক্ষেত্রে এটি পরিষ্কার করা সহায়ক হতে পারে কারণ কুকি ডোমেন মেলে তবে এটি প্রেরণ হচ্ছে না কারণ এজেএক্স অনুরোধটি একটি ভিন্ন সাবডোমেন তৈরি করা হচ্ছে। এই ক্ষেত্রে, আমার কাছে একটি কুকি রয়েছে যা * .mydomain.com ডোমেইনে অর্পণ করা হয়েছে , এবং আমি এটি আলাদা . mydomain.com "এজেএক্স অনুরোধে অন্তর্ভুক্ত করতে চাই ।" ডিফল্টরূপে, কুকিটি প্রেরণ হয় না। এই সমস্যাটি সমাধান করার জন্য আপনার সেশন কুকিতে HTTPONLY নিষ্ক্রিয় করার দরকার নেই omb গর্ভগর্ভের পরামর্শ অনুসারে আপনাকে কেবল এটি করতে হবে ( https://stackoverflow.com/a/23660618/545223 ) এবং নিম্নলিখিতগুলি করুন।
1) আপনার এজ্যাক্স অনুরোধে নিম্নলিখিতগুলি যুক্ত করুন।
xhrFields: { withCredentials:true }
2) বিভিন্ন সাবডোমেনের সংস্থানগুলির জন্য আপনার প্রতিক্রিয়া শিরোনামগুলিতে নিম্নলিখিতগুলি যুক্ত করুন।
Access-Control-Allow-Origin : http://original.mydomain.com
Access-Control-Allow-Credentials : true
অন্যান্য সমাধানগুলি চেষ্টা করার পরেও এটি কাজ না করার পরে, আমি আমার ক্ষেত্রে সমস্যাটি কী তা খুঁজে পেয়েছি। আমি "অ্যাপ্লিকেশন / জসন" থেকে কন্টেন্টটাইপকে "পাঠ্য / প্লেইন" এ পরিবর্তন করেছি।
$.ajax(fullUrl, {
type: "GET",
contentType: "text/plain",
xhrFields: {
withCredentials: true
},
crossDomain: true
});
আমার একই সমস্যা ছিল এবং আমার স্ক্রিপ্টটি পরীক্ষা করা কেবল সেশনড কুকি পাচ্ছিল না।
আমি ব্রাউজারে সেশনড কুকি মানটি দেখে বুঝতে পেরেছিলাম যে আমার ফ্রেমওয়ার্ক (জাজানো) এইচটিপিওনি দিয়ে ডিফল্ট হিসাবে সেশনিড কুকিটি পার করছে। এর অর্থ হ'ল স্ক্রিপ্টগুলিতে সেশনড মানটিতে অ্যাক্সেস নেই এবং তাই এটি অনুরোধের সাথে পাস করছে না। হাস্যকর বিষয় যে এতগুলি জিনিস আজাক্স ব্যবহার করে যখন অ্যাক্সেসের সীমাবদ্ধতার প্রয়োজন হবে তখন এইচটিটিপিই কেবলমাত্র ডিফল্ট মান হবে।
এটির সমাধানের জন্য আমি একটি সেটিংস পরিবর্তন করেছি (SESSION_COOKIE_HTTPONLY = মিথ্যা) তবে অন্য ক্ষেত্রে এটি কুকির পথে একটি "এইচটিটিপি ওলি" পতাকা হতে পারে
যদি আপনি উপরের উত্তরগুলিতে বর্ণিত পদক্ষেপগুলি ছাড়াও localhost
লোকালহোস্টের কোনও বন্দর বা বন্দর বিকাশ করছেন তবে আপনাকেও localhost:8080
নিশ্চিত করতে হবে যে আপনি সেট-কুকি শিরোনামে কোনও ডোমেন মান পাস করছেন না।
আপনি localhost
সেট-কুকি শিরোনামে ডোমেন সেট করতে পারবেন না - এটি ভুল - কেবলমাত্র ডোমেন বাদ দিন।
স্পষ্ট ডোমেন সহ লোকালহোস্টের কুকিগুলি দেখুন এবং কেন এ্যাসপনেটার লোকালহোস্টে কুকিজ তৈরি করবে না?
লোকালহোস্ট এবং ডেভ পরিবেশের অধীনে থাকাকালীন PHPSESSID কুকি ইস্যু সেট করতে আমার কেবল 2 সেন্ট। আমি লোকাহোস্টে আমার REST API এর শেষ পয়েন্টে AJAX কল করি। বলুন এর ঠিকানাটি mysite.localhost/api/member/login/
(আমার দেব পরিবেশে কার্যত হোস্ট)।
আমি পোস্টম্যানের কাছে যখন এই অনুরোধটি করি তখন জিনিসগুলি ঠিকঠাক হয় এবং প্রতিক্রিয়াটির সাথে PHPSESSID সেট করা হয়।
আমি যখন ব্রাউজারসিন্সি প্রক্সাইড পৃষ্ঠা থেকে এজেএক্সের মাধ্যমে এই শেষ পয়েন্টটির জন্য অনুরোধ করি (উদাহরণস্বরূপ 122.133.1.110:3000/test/api/login.php
আমার ব্রাউজারের ঠিকানা লাইন থেকে, ডোমেনটি ভিন্ন বনাম দেখুন mysite.localhost
) পিএইচপিএসইএসআইডি কুকিজের মধ্যে উপস্থিত হয় না।
আমি যখন একই ডোমেনে পৃষ্ঠাটি থেকে সরাসরি এই অনুরোধটি করি (যেমন mysite.localhost/test/api/login.php
) পিএইচপিএসইএসআইডি ঠিক ঠিক সেট করা থাকে।
সুতরাং এটি উপরে ক্রুস-উত্সের অনুরোধ কুকিজ ইস্যু যা উপরে @ ফ্লু উত্তরে উল্লিখিত হয়েছে
আমার পরিস্থিতি এবং সমাধানটি যুক্ত করা যদি এটি অন্য কাউকে সহায়তা করে। RESTful API গুলি ব্যবহার করার সময় আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমার ওয়েব সার্ভার হোস্টিং এইচটিএমএল / স্ক্রিপ্ট / সিএসএস ফাইল এবং অ্যাপ্লিকেশন সার্ভার এক্সপোজারিং এপিআই একই ডোমেনে হোস্ট করা হয়েছিল। তবে পথটি ছিল আলাদা।
ওয়েব সার্ভার - মাইডোমাইন / ওয়েবপেজ /abc.html
ব্যবহৃত abc.js যা কুকিটির নাম মাইকুকি সেট করে
অ্যাপ সার্ভার - মায়ডোমেন / ওয়েবপিস / সার্ভিসনেম en
যা এপিআই কল করা হয়েছিল
আমি মাইডোমাইন / ওয়েবপিস / সার্ভিসনেমে কুকিটি আশা করছিলাম এবং এটি পড়ার চেষ্টা করেছি তবে এটি প্রেরণ করা হয়নি। উত্তরটি থেকে মন্তব্য পড়ার পরে, আমি ব্রাউজারের বিকাশের সরঞ্জামটি চেক করেছিলাম যে মাইকির পথটি "/ ওয়েবপৃষ্ঠাগুলি " তে সেট করা আছে এবং তাই পরিষেবা কলটিতে উপলভ্য নয়
mydomain / webapis / SERVICENAME
সুতরাং jquery থেকে কুকি সেট করার সময়, আমি এটিই করেছি -
$.cookie("mycookie","mayvalue",{**path:'/'**});
সম্ভবত প্রশ্নের জবাব 100% নয়, তবে আমি যখন ইনোভাস্টুডিও সম্পাদক সম্পাদকের সম্পদ ব্যবস্থাপনার কাছ থেকে কোনও ফাইল আপলোড আজাক্স-পোস্ট করার সময় একটি সেশন সমস্যা সমাধানের আশায় এই থ্রেডটিতে পড়েছিলাম। শেষ পর্যন্ত সমাধানটি সহজ ছিল: তাদের একটি ফ্ল্যাশ-আপলোডার রয়েছে। সেটিংস (সেটিংস) অক্ষম করা হচ্ছে
var flashUpload = false;
asset.php এ) এবং লাইটগুলি আবার জ্বলতে শুরু করে।
এই সমস্যাগুলি ডিবাগ করা খুব কঠিন হতে পারে যে আমি খুঁজে পেয়েছি যে আপলোড হ্যান্ডলারের মধ্যে নীচের মতো কিছু স্থাপন করা আপনাকে সঠিক ট্র্যাকের উপর সেট করবে (ভাল, আমি এই ক্ষেত্রে):
$sn=session_name();
error_log("session_name: $sn ");
if(isset($_GET[$sn])) error_log("session as GET param");
if(isset($_POST[$sn])) error_log("session as POST param");
if(isset($_COOKIE[$sn])) error_log("session as Cookie");
if(isset($PHPSESSID)) error_log("session as Global");
লগটিতে একটি ডুব দিলাম এবং আমি দ্রুত অনুপস্থিত অধিবেশনটি স্পষ্ট করেছিলাম, যেখানে কোনও কুকি প্রেরণ করা হয়নি।
session_name(isset($_GET['sess']) ? $_GET['sess'] : null);session_start();
এইভাবে একটি জিইটি মান থেকে সেশন_নাম সেট করতে পারে , তারা একটি কাজের জিনিস পেতে চাইবে