কোনও ব্যবহারকারী যখন তাদের কম্পিউটারকে ঘুমের দিকে রাখে তখন কোনও ওয়েবসাইট থেকে লগ আউট করে


11

এটি একটি উদ্ভট। আমাদের কাছে একটি লারাভেল ওয়েবসাইট রয়েছে এবং সেই সাইটটিতে ব্যবহারকারী প্রতি আমাদের একটি টাইমার রয়েছে, যেখানে তারা বুট হওয়ার আগে 15 মিনিট নিষ্ক্রিয় থাকে।

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

লারাভেল-ওয়েবসকেট লাইব্রেরি এবং ইকো ব্যবহার করে আমরা ওয়েব সকেট ব্যবহার করি । আমি যা ঘটতে চাই তা হ'ল:

  • একবার আপনি ল্যাপটপ বুট করার পরে লগইন স্ক্রিনে যান। সুতরাং পরের বার আপনি ল্যাপটপটি খুলুন এবং লগইন করুন এবং লগইন স্ক্রিনে থাকা ব্রাউজারটি দেখুন। এটি দ্রুত ঘটতে হবে না, তবে আমাদের প্রথম প্রান্তে কিছু পাঠানোর একটি উপায়ের দরকার যা মূলত তাদের পৃষ্ঠাটি রিফ্রেশ করার জন্য বলছিল, একবার সেশনটি মারা যাওয়ার পরে, আমরা সেশনটির জীবনকাল 15 মিনিটের লারভেলে সেট করি।

কিছু লোক অনুরূপ অন্যান্য প্রশ্নে পরামর্শ দিয়েছে:

  • একটি কাস্টম ওয়েব সকেট হ্যান্ডলার তৈরি করতে
  • পিছনের প্রান্তে থাকা ব্যবহারকারী কুকির সাথে সেশন কুকি (ব্রাউজারে) তুলনা করতে।
  • সামনের প্রান্তে টাইমার চলার জন্য (আমরা এটি করি যখন আপনি ল্যাপটপের idাকনাটি বন্ধ করেন কেবল তখনই থেমে যায়)

সর্বাধিক জনপ্রিয় একটি ওয়েব সকেট ব্যবহার করছে বলে মনে হচ্ছে, ব্যবহারকারীকে সংযোগ বিচ্ছিন্ন করতে এবং তারপরে সেগুলি বুট করার জন্য শুনছেন, যা ভাল এবং সব কিছু, তবে আপনি কীভাবে কোনও ব্রাউজারের কাছে অনুরোধ প্রেরণ করবেন যাতে সেগুলি বুট করা যায় না?

আমি অনুরোধআইডেলক্যালব্যাক () খুঁজে পেয়েছি তবে আবারও, আমি মনে করি না যে আমি ইতিমধ্যে সাইটে যদি হার্টবিট টাইমার রাখি তবে এটিই আমি চাই want এটি সমস্ত ব্রাউজারেও কাজ করে না।

এটি কীভাবে সম্পাদন করতে হয় তা সম্পর্কে আমি এখানে খুব হারিয়ে গেছি, উদাহরণটি আমি দিতে পারি:

আপনার ব্যাঙ্কে লগ ইন করুন, আপনার কম্পিউটারকে ঘুমাতে দিন, 15-20 মিনিট অপেক্ষা করুন, কম্পিউটার জাগ্রত করুন, লগ ইন করুন এবং দেখুন আপনার ব্যাঙ্কটিতে এখন আপনাকে লগইন স্ক্রিনে রয়েছে। এটাই আমি চাই । তবে কীভাবে তা সম্পাদন করতে হয় তা আমি জানি না।

আপনি পিছনের প্রান্ত থেকে "স্লিপিং" ব্রাউজারে ইভেন্টগুলি প্রেরণ করতে পারবেন না, এবং হ্যাঁ এটির পিছনে সমাধান হওয়া উচিত, তখন আপনি সামনের প্রান্তটি কীভাবে আপডেট করবেন, যাতে ল্যাপটপটি পুনরায় জাগ্রত করার সময় তারা লগআউট স্ক্রিনে থাকে বা কম্পিউটার?


7
সেশন কুকের মেয়াদ শেষ হওয়ার তারিখটি কেবলমাত্র "এখন + 15 মিনিট" তে সেট করুন ... যদিও আপনি এখনও শেষ পর্দাটি দেখতে পাচ্ছেন, কুকির মেয়াদ শেষ হয়ে গেলে আপনি সেই সেশনে অভিনয় করতে পারবেন না। এবং "স্ক্রিনটি লগইন করুন" - আমি নিশ্চিত যে একটি ওএস সেটিংস রয়েছে যা নিষ্ক্রিয়তার একটি নির্দিষ্ট সময় পরে স্বয়ংক্রিয়ভাবে একটি কম্পিউটার লগআউট করবে ..
লার্স স্টেগলিটজ

1
যখনই কোনও সাইট লোড হবে আপনি যখনই জাভাস্ক্রিপ্ট টাইমারটি শুরু করতে পারেন, আপনার সেশন কুকির সমান সময়সীমা সহ ... যদি টাইমার "বেজে যায়", ব্যবহারকারী এতদিন নিষ্ক্রিয় ছিলেন। তারপরে আপনি তাকে লগ আউট করতে পারেন (এজেএক্স কল) এবং ব্রাউজারটি লগইন-স্ক্রিনে বা "দুঃখিত, নিষ্ক্রিয়তার কারণে আমরা আপনাকে লগ আউট করেছি";)
লার্স স্টেগলিটজ

1
ঠিক আছে আমি এটি সম্পন্ন করেছি আমি এখনই উত্তর যুক্ত করছি।
ডেটো ডিটি

1
তাহলে কি এই উপকারী ছিল?
ডেটো ডিটি

1
@ ড্যাটোডিটি না, আমি লারাভেলটি ব্যবহার করি, দু'টি আমি আমার উদ্বোধনী পোস্টে প্রকাশিত লারাভেল সকেট ব্যবহার করেছি, দুটি আপনার কোড খুব অগোছালো, ওওপি নয়, পরীক্ষিত নয় এবং আমি কখনই এটি ব্যবহার করব না। আমি মূলত একটি ল্যারাভেল সলিউশন খুঁজছি।
দ্য ওয়েবস

উত্তর:


0

হালনাগাদ

ওয়েবসকেটের অনুরোধ সম্পর্কিত, আমি ধরে নিচ্ছি আপনি লারাভেল ওয়েবসকেট এর সাথে ব্যবহার করছেন pusherপুশার.ইও সময়সীমা সমর্থন করে না , আপনি এই সমর্থন নিবন্ধটি পড়তে পারেন "আপনি কি চ্যানেল পুশার-জেএস ক্লায়েন্ট লাইব্রেরিতে সংযোগের সময়সীমা বৈশিষ্ট্য যুক্ত করার পরিকল্পনা করছেন?" । আপনি যদি লারাভেল ডিবাগ মোড ( APP_DEBUG=true অভ্যন্তরীণ .env ) সক্ষম করেন এবং laravel-websocketsটার্মিনাল ( php artisan websockets:serve) থেকে অনুরোধ করেন আপনি এটি পরীক্ষা করে দেখতে পারেন যাতে আপনি আউটপুট লগ ইভেন্টগুলি দেখতে পারেন। আপনি যদি ল্যাপটপের lাকনাটি বন্ধ করার বা কম্পিউটারকে হাইবারনেশন মোডে ( স্লিপ ) সেট করার চেষ্টা করেন , আপনি এই ইভেন্ট সম্পর্কিত কোনও বার্তা দেখতে পাবেন না। আপনি এটি pusherপ্রোটোকল দিয়ে করতে পারবেন না । নেই উপস্থিতি ঘটনাmember_removed , তবে এটি কেবল তখনই ট্রিগার হয় যখন আপনি ট্যাবটি বন্ধ করেন বা লগআউট করেন। অবশ্যই আপনি আপনার ক্লায়েন্ট কাস্টম ইভেন্টটিকে উপস্থিতি চ্যানেলে ট্রিগার করতে পারেন, তবে এটি করতে আপনাকে ক্লায়েন্ট পক্ষের সাথে টাইমার সেটআপও প্রয়োজন এবং আপনাকে laravel-websocketsএই গিথুব ইস্যুর মতো সার্ভারের জন্য একটি পরিষেবা সরবরাহকারী তৈরি করতে হবে "এর উপায় বিদ্যমান ওয়েবহুক বাস্তবায়ন করবেন? "

কিছু লোক অনুরূপ অন্যান্য প্রশ্নে পরামর্শ দিয়েছে:

...

  • সামনের প্রান্তে টাইমার চলার জন্য ( আমরা এটি করি যখন আপনি ল্যাপটপের idাকনাটি বন্ধ করেন কেবল তখনই থেমে যায় )

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

ক্লায়েন্টে সময় যুক্তি প্রয়োগ করা

আপনি এই সম্পর্কিত Q / A তে এই বাস্তবায়নটি দেখতে পারেন : কম্পিউটার যখন ঘুম থেকে পুনরায় শুরু হয় তখন কোনও ডেস্কটপ ব্রাউজার সনাক্ত করতে পারে?

আপনি প্রতি মিনিট চালানোর জন্য ক্লায়েন্টে একটি টাইমার সেটআপ করতে পারেন। আমরা টাইমার ব্যবধানের উপর নির্ভর করব না , তবে এর পরিবর্তে টাইমার একটি বাহ্যিক স্কোপ তারিখের পরিবর্তনশীল পরীক্ষা করবে যদি শেষ টাইমার থেকে সময়কাল 15মিনিটের চেয়ে বেশি হয় ; যদি এটি হয়, তবে এর অর্থ হ'ল ব্রাউজার / জেএস কোনও কারণে মৃত্যুদন্ড কার্যকর করা বন্ধ করে দিয়েছে , সম্ভবত ডিভাইসটির হাইবারনেশন ( ঘুম ) এবং তারপরে আপনি ব্যবহারকারীকে লগআউট রুটে পুনঃনির্দেশ করুন।

জেএস ক্লায়েন্ট কোড উদাহরণ:

// Set a variable to check previous time
let clientSession = new Date;

// Setup the client session checking timer
let clientSessionTimer = setInterval(() => {
  const now = new Date;
  // Get how many seconds have passed since last check
  const secondsSpan = (now - clientSession) / 1000;

  // If the 1 minute timer has exceeded 15 minutes trigger logout and clear timer
  if (secondsSpan > (60 * 15)) {
    // For some reason JS halted execution, so we'll proceed with logging out
    clearInterval(clientSessionTimer);
    window.location.href = '/logout/session'
  } else {
    // The timer runs as it should, update the clientSession time
    clientSession = now;
  }

}, 1000 * 60);

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

ওয়েব ওয়ার্কার্স উদাহরণ

এমনকি আপনি আরও বেশি নিরাপদ হতে ওয়েব কর্মী সেটআপ করতে ওয়েব ওয়ার্কার্স এপিআই ব্যবহার করতে পারেন :

পৃষ্ঠা জেএস কোড:

const logoutWorker = new Worker('logoutWorker.js');
logoutWorker.onmessage = function (ev) {

  if (ev && ev.data === 'wakeup') {
    logoutWorker.terminate();
    // window.location.href = '/logout/session'
  } else {
    // The timer runs as it should, nothing to do
  }
}

ওয়েব কর্মী logoutWorker.jsকোড:

let clientSession = new Date();

let clientSessionTimer = setInterval(() => {
  const now = new Date;
  const secondsSpan = (now - clientSession) / 1000;

  if (secondsSpan > 15) {
    postMessage('wakeup'); // Send a message wakeup to the worker page
    clearInterval(clientSessionTimer); // Clear the timer
  } else {
    clientSession = now; // Update the clientSession timer variable
    postMessage('update'); // And post a message to the page ONLY IF needed
  }
}, 1000);

আপনি এখানে একই 15সেকেন্ডের টাইমার সহ ওয়েব কর্মী উদাহরণটিও পরীক্ষা করতে পারেন ।


এটি 15 সেকেন্ড পরে আপনাকে লগ আউট করে, যাই হোক না কেন, নিশ্চিত না যে তিনি এটি যা খুঁজছেন।
ইসলাম এলশোবোকশী

@ ইসলামা ইলশোবোকশী আপনি ঠিক বলেছেন, ধরার জন্য ধন্যবাদ। আমি clientSessionভেরিয়েবল আপডেট করতে ভুলে গেছি । আপনি আমার উত্তরটি আবার পরীক্ষা করতে পারেন, আমি এমনকি একটি ওয়েব কর্মীর উদাহরণও জুড়েছি।
ক্রিস্টোস লাইট্রাস

দয়া করে নমুনা উদাহরণগুলি আপডেট করুন যা এখনও কাজ করে না। প্রথম যাই হোক না কেন 15 সেকেন্ড পরে আপনাকে লগ আউট করে। দ্বিতীয়টি আপনাকে কখনও লগ আউট করে না।
ইসলাম এলশোবোকশী

@ ইস্লামএলশোবকশী আমি অবশ্যই এটি আপডেট করেছি। আগে এটির কোনও সমস্যা ছিল এবং এখন এটি প্রত্যাশার মতো কাজ করে। আপনি যদি না পেয়ে থাকেন বা ?v=1শেষের মতো কোনও পরম যোগ করেন তবে দয়া করে পৃষ্ঠাটি রিফেট করুন ।
ক্রিস্টোস লাইট্রাস

1
দুর্দান্ত সমাধান + 3
আমেরেলিকা

0

প্রথমে, কীভাবে কোনও ওয়েবসাইট ছাড়াই 15 মিনিটের পরে ব্যাংকিং ওয়েবসাইটগুলি আপনাকে লগ আউট করে সে সম্পর্কে প্রসারিত করা যাক। এটি সুরক্ষার জন্য পিসিআই প্রয়োজনীয়তা।

পিসিআই-ডিএসএস প্রয়োজন 8.1.8 :

8.1.8 যদি কোনও সেশনটি 15 মিনিটেরও বেশি সময় অলস থাকে, তবে টার্মিনাল বা সেশনটি পুনরায় সক্রিয় করতে ব্যবহারকারীকে পুনরায় প্রমাণীকরণের প্রয়োজন।

এটি অর্জন করার জন্য সমাধানটি আপনি যতটা কল্পনা করেছেন তার থেকে অনেক বেশি আদিম । এটির জন্য ওয়েবসকেট ব্যবহার বা ক্লায়েন্টের মেশিনের অবস্থা (ঘুম বা জাগ্রত বা অন্যথায়) সম্পর্কে কিছু জানা প্রয়োজন। প্রয়োজনীয় সমস্তই সেই অধিবেশনটি ব্যবহার করে বর্তমান অনুরোধ এবং একই অনুরোধটি ব্যবহার করে শেষ অনুরোধের মধ্যে সময় নির্ধারণ করা এবং এটি 15 মিনিটের বেশি দূরে নয় তা নিশ্চিত করা। যদি তারা হয় তবে ব্যবহারকারীকে পুনরায় সত্যায়িত করতে হবে। যদি তারা না হয় তবে আপনি অনুরোধটি নিয়ে এগিয়ে যেতে পারেন।

"সেশনটির সময়সীমা শেষ" বার্তাটি

আপনি সম্ভবত তখন ভাবছেন (যদি এটি সাধারণ হয়) আপনি কম্পিউটারটি ঘুমানোর সময় এবং জাগ্রত করার সময় সেশনটির সময়সীমা বার্তাটি কীভাবে উপস্থিত হয়। এই অংশটি প্রতারণামূলকভাবে সহজ is

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

যাইহোক, এটি জাভাস্ক্রিপ্ট বার্তা মডেলের জন্য অ্যাকাউন্ট করবে না (যদি আপনি সেই বিষয়টি উল্লেখ করছেন) যা কিছু ব্যাংকিং ওয়েবসাইটগুলি করে। এছাড়াও সমস্ত ব্রাউজারগুলি সমস্ত পরিস্থিতিতে পাতায় একটি হার্ড রিফ্রেশ করে না। সুতরাং অন্য একটি পদ্ধতির গ্রহণ করা যেতে পারে। ব্রাউজারে টাইমার থাকার চেয়ে ১৫ মিনিটের পরে আপনি জাভাস্ক্রিপ্টে পৃষ্ঠা লোডের সময়টিকে টাইমস্ট্যাম্প হিসাবে সহজেই সঞ্চয় করতে পারেন এবং একটি ১ সেকেন্ডের ব্যবধান সময় যা কম্পিউটারের বর্তমান টাইমস্ট্যাম্পের সাথে তুলনা করে। যদি তারা 15 মিনিটের বেশি দূরে থাকে তবে সেশনটি সমাপ্ত করা উচিত।

window.onload = function() {

    sessionStart = Date.now();
    timer = setInterval(function() {
        if (Date.now() - sessionStart > 15 * 60 * 1000) {
            clearTimeout(timer);
            alert("Session Timed out!");
            window.location = "http://www.example.com/login";
        }
    }, 1000);


};

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

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

এটি onloadআমরা আগের মতো একই ইভেন্ট কলব্যাকে করা যেতে পারে :

window.onload = function() {

    sessionStart = Date.now();
    timer = setInterval(function() {
        if (Date.now() - sessionStart > 10 * 60 * 1000) {
           if (confirm("Your session is about to timeout. Do you wish to continue?")) {
                // send ajax request to refresh session TTL here
                // reset the timer
                sessionStart = Date.now();
            }
        } else if (Date.now() - sessionStart > 15 * 60 * 1000) {
            clearTimeout(timer);
            alert("Session Timed out!");
            window.location = "http://www.example.com/login";
        }
    }, 1000);


};

সার্ভার সাইডে সেশন সমাপ্তি হ্যান্ডলিং

সার্ভারের দিকে সেশন সমাপ্তি পরিচালনা করতে বেশ কয়েকটি পন্থা রয়েছে। আপনি কোনটি ব্যবহার করছেন তার উপর নির্ভর করে আপনার বিভিন্ন কৌশল প্রয়োজন। একজন পিএইচপি-র ডিফল্ট সেশন হ্যান্ডলারটি ব্যবহার করছে এবং session.max_lifetime15 মিনিটের পরে মেয়াদ শেষ হওয়ার জন্য সেটিংস সেট করছে (এটি ক্লায়েন্টের কুকিকে অকার্যকর করে সার্ভারের সেশন ডেটা পুরোপুরি মুছে দেয়)।

আপনি যদি ডিফল্ট সেশন হ্যান্ডলার প্রক্রিয়াটি করতে দেন তবে আপনি কোন হ্যান্ডলারটি ব্যবহার করছেন তা নির্ভর করে (ফাইল, মেমক্যাচড, রেডিস, কাস্টম, ইত্যাদি) সমস্যার মধ্যে চলে যেতে পারেন।

ফাইলগুলির সাথে (ডিফল্ট হ্যান্ডলার) আবর্জনা সংগ্রহ দুটির একটির মাধ্যমে ঘটে:

  • বেশিরভাগ ডেবিয়ান ভিত্তিক সিস্টেম ক্রোন কাজের মাধ্যমে তাদের নিজস্ব জিসি করে (যা আপনার দৃশ্যের জন্য দুর্দান্ত কাজ করে)
  • অন্যান্য ডিস্ট্রোস পিএইচপি-র ডিফল্ট জিসি মেকানিজমটি এটি পরিচালনা করতে দেয় যা পিএইচপি-র প্রতিটি আগমন অনুরোধের সম্ভাব্য ফলাফলের ভিত্তিতে যা সেশন ফাইলগুলিতে ফাইল এমটাইম পরীক্ষা করে এবং তাদের অতীতগুলি মুছে দেয় session.max_lifetime। এই পদ্ধতির সমস্যাটি হ'ল কম ট্রাফিক সাইটগুলিতে session.gc_probabilityসেশন ফাইলগুলি পরিষ্কার করার জন্য জিসিকে অনুরোধ করার জন্য পর্যাপ্ত আবেদনগুলি ( স্কোরের উপর নির্ভর করে ) না আসা পর্যন্ত একটি অধিবেশন সম্ভাব্যভাবে সেখানে দীর্ঘ সময় ধরে বসে থাকতে পারে ।

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

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

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


0

সুতরাং আইডিয়া সেটআইন্টারওয়াল এবং সকেটগুলির পিছনে রয়েছে, সেট ইনটার্ভাল বেশিরভাগ ব্রাউজারে সমর্থিত এবং জাভাস্ক্রিপ্ট WbsketApi প্রায় প্রতিটি ব্রাউজারে সমর্থিত।

সংক্ষিপ্ত ওভারভিউ: সেটইন্টারওয়াল () - আপনার কম্পিউটারটি যখন স্লিপ / সাসপেন্ড / হাইবারনেট মোডে থাকে তখন এটিকে বিরতি দেওয়া হয় এবং আপনি যখন জাগ্রত মোডে থাকেন তখন এটি আবার শুরু হয়।

নিম্নলিখিত কোডটি নিম্নলিখিতটি করে, প্রথমে (সম্ভবত একই সময়ে তবে) এটি পিএইচপি সার্ভার_সোকেট সংযোগগুলি শোনার শুরু করে,

জাভাস্ক্রিপ্টের চেয়ে ওয়েবসকেট এপিআই ইউনিক্স টাইমস্ট্যাম্প মিলিসেকেন্ডগুলিতে প্রতি 2 সেকেন্ডে বর্তমান টাইমস্ট্যাম্প প্রেরণ করে আপনি 1 সেকেন্ডে এটি আপ করতে পারেন।

পিএইচপি সার্ভারের সকেটটি এবার পাওয়ার পরে এবং তার সাথে তুলনা করার মতো আগের সময়ের মতো কিছু আছে কিনা তা যাচাই করে, যখন কোডটি প্রথম ইনস্ট্যান্ট হয় পিএইচপি এর সাথে জাভাস্ক্রিপ্ট ওয়েবসকেট থেকে প্রেরিত সময়ের সাথে তুলনা করার জন্য আগের সময়ের মতো কিছু নেই, তাই পিএইচপি 'prev_Time' নামক অধিবেশনটিতে এবার সময় সাশ্রয় ছাড়া কিছুই করে না এবং জাভাস্ক্রিপ্ট সকেট থেকে অন্য সময়ের ডেটা পুনরুদ্ধারের জন্য অপেক্ষা করে, সুতরাং এখানে দ্বিতীয় চক্র শুরু হয়। যখন জাভাস্ক্রিপ্ট ওয়েবসাইটসকপি থেকে পিএইচপি সার্ভার সকেট নতুন সময়ের ডেটা পরীক্ষা করে এটি এই নতুন প্রাপ্ত সময়ের ডেটার সাথে তুলনা করার জন্য আগের সময়ের মতো কিছু আছে তা পরীক্ষা করে, এর অর্থ পিএইচপি চেক করে যে 'অ্যাড-টাইম' নামক সেশনটি উপস্থিত রয়েছে, কারণ আমরা দ্বিতীয় চক্রের পিএইচপি আবিষ্কার করি যে এটি বিদ্যমান, এটির মান ধরে এবং নিম্নলিখিতগুলি করে$diff = $new_time - $prev_time, f পার্থক্যটি 2 সেকেন্ড বা 2000 মিলিয়ন সেকেন্ডের হবে কারণ আমাদের সেট ইন্টার্নাল চক্রটি প্রতি 2 সেকেন্ডে ঘটে এবং সময় ফর্ম্যাটটি আমরা পাঠাচ্ছি এটি মিলিসেকেন্ডে হয়,

পিএইচপি চেক করার চেয়ে if($diff<3000)যদি পার্থক্যটি 3000 এর চেয়ে কম হয় তবে যদি এটি জানা থাকে যে ব্যবহারকারী সক্রিয় আছেন, আবার আপনি আপনার ইচ্ছামতো এই সেকেন্ডে ম্যানিপুলেট করতে পারেন, আমি 3000 বেছে নিই কারণ নেটওয়ার্কে সম্ভাব্য বিলম্বিতা যা প্রায় অসম্ভব তবে আপনি জানেন আমি যখন সর্বদা সতর্ক থাকি এটি নেটওয়ার্কগুলিতে আসে, সুতরাং চলুন, যখন পিএইচপি নির্ধারণ করে যে ব্যবহারকারী সক্রিয় রয়েছে পিএইচপি কেবলমাত্র 'পূর্ব_কালীন' সেশনটি পুনরায় সেট করে $new_timeযার মান নতুনভাবে প্রাপ্ত হয়েছিল এবং কেবল পরীক্ষার উদ্দেশ্যে এটি জাভাস্ক্রিপ্ট সকেটে বার্তা প্রেরণ করে,

তবে যদি $diff3000 এর বেশি হয় তবে এর অর্থ এই যে কোনও কিছু আমাদের সেট ইনটারওয়ালকে বিরতি দিয়েছে এবং এটি ঘটতে পারে এমন একমাত্র উপায় আছে এবং আমি মনে করি আপনি ইতিমধ্যে জানেন যা আমি বলছি তাই else, ( if($diff<3000)) এর যুক্তিতে আপনি নির্দিষ্ট সেশনটি ধ্বংস করে ব্যবহারকারীকে লগআউট করতে পারেন এবং যদি আপনি আপনাকে জাভাক্রিপ সকেটে কিছু পাঠ্য প্রেরণ করতে এবং পাঠ্যের window.location = "/login"উপর নির্ভর করে একটি যুক্তি তৈরি করতে পারেন যা এখানে কোড:

প্রথমে এটি জাভাস্ক্রিপ্ট লোড করার জন্য সূচিপত্রের HTML ফাইল file

<html>
    <body>
        <div id="printer"></div>
        <script src="javascript_client_socket.js"></script>
    </body>
</html>

তারপরে এটি জাভাস্ক্রিপ্ট যা সত্যই সুন্দরভাবে কোড করা হয়নি তবে আপনি গুরুত্বপূর্ণ মন্তব্যগুলি পড়তে পারেন তা বুঝতে পারেন:

var socket = new WebSocket('ws://localhost:34237'); // connecting to socket
    // Open the socket
socket.onopen = function(event) { // detecting when connection is established
        setInterval(function(){ //seting interval for 2 seconds
            var date = new Date(); //grabing current date
            var nowtime = Date.parse(date); // parisng it in miliseconds
            var msg = 'I am the client.'; //jsut testing message


            // Send an initial message
            socket.send(nowtime); //sending the time to php socket
    },2000);

};


// Listen for messages
socket.onmessage = function(event) { //print text which will be sent by php socket 
    console.log('php: ' + event.data);
};

// Listen for socket closes
socket.onclose = function(event) {
    console.log('Client notified socket has closed', event);
};

এখন এখানে পিএইচপি কোডের একটি অংশ রয়েছে, পুরো কোড রয়েছে তা ভেবে চিন্তিত হবেন না তবে এই অংশটি হ'ল উপরে বর্ণিত কাজগুলি আপনি অন্যান্য ফাংশনগুলিতেও মিলিত হবেন তবে তারা জাভাস্ক্রিপ্ট সকেটগুলি ডিকোডিং এবং কাজ করার জন্য তাই এটি আসল জিনিসটি সঠিক right এখানে গুরুত্বপূর্ণ মন্তব্যগুলি পড়ুন তারা গুরুত্বপূর্ণ:

<?php 
            $decoded_data = unmask($data /* $data is actual data received from javascript socket */); //grabbing data and unmasking it | unmasking is for javascript sockets don't mind this
            print("< ".$decoded_data."\n");
            $response = strrev($decoded_data);
            $jsTime = (int) $decoded_data; /* time sent by javascript in MILISECONDS IN UNIX FORMAT  */
            if (isset($_SESSION['prev_time'])) { /** check if we have stored previous time in the session */
               $prev_time = (int) $_SESSION['prev_time']; /** grabbing the previous time from session */
               $diff = $jsTime-$prev_time; /** getting the difference newly sent time and previous time by subtracting */
               print("$jsTime - $prev_time = $diff"); /** printing the difference */
               if($diff<3000){ /** checking if difference is less than 3 second if it is it means pc was not at sleep
                               *** you can manipulate and have for example 1 second = 1000ms */
                    socket_write($client,encode("You are active! your pc is awakend"));
                    $_SESSION['prev_time'] = $jsTime; /** saving newly sent time as previous time for future testing whcih will happen in two seconds in our case*/
                }else { /** if it is more than 3 seconds it means that javascript setInterval function was paused and resumed after 3 seconds 
                            ** So it means that it was at sleep because when your PC is at sleep/suspended/hibernate mode setINterval gets pauesd */
                    socket_write($client,encode("You are not active! your pc is at sleep"));
                    $_SESSION['prev_time'] = $jsTime;
                }
            }else { /** if we have not saved the previous time in session save it  */
                $_SESSION['prev_time'] = $jsTime;
            }

            print_r($_SESSION);

?>

এবং এখানে পিএইচপি এর পুরো কোডটি রয়েছে:

<?php
//Code by: Nabi KAZ <www.nabi.ir>
session_abort();
// set some variables
$host = "127.0.0.1";
$port = 34237;
date_default_timezone_set("UTC");


// don't timeout!
set_time_limit(0);

// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0)or die("Could not create socket\n");

// bind socket to port
$result = socket_bind($socket, $host, $port)or die("Could not bind to socket\n");

// start listening for connections
$result = socket_listen($socket, 20)or die("Could not set up socket listener\n");

$flag_handshake = false;
$client = null;
do {
    if (!$client) {
        // accept incoming connections
        // client another socket to handle communication
        $client = socket_accept($socket)or die("Could not accept incoming connection\n");
    }

    $bytes =  @socket_recv($client, $data, 2048, 0);
    if ($flag_handshake == false) {
        if ((int)$bytes == 0)
            continue;
        //print("Handshaking headers from client: ".$data."\n");
        if (handshake($client, $data, $socket)) {
            $flag_handshake = true;
        }
    }
    elseif($flag_handshake == true) {

        /*
        **** Main section for detectin sleep or not **
        */
        if ($data != "") {
            $decoded_data = unmask($data /* $data is actual data received from javascript socket */); //grabbing data and unmasking it | unmasking is for javascript sockets don't mind this
            print("< ".$decoded_data."\n");
            $response = strrev($decoded_data);
            $jsTime = (int) $decoded_data; /* time sent by javascript in MILISECONDS IN UNIX FORMAT  */
            if (isset($_SESSION['prev_time'])) { /** check if we have stored previous time in the session */
               $prev_time = (int) $_SESSION['prev_time']; /** grabbing the previous time from session */
               $diff = $jsTime-$prev_time; /** getting the difference newly sent time and previous time by subtracting */
               print("$jsTime - $prev_time = $diff"); /** printing the difference */
               if($diff<3000){ /** checking if difference is less than 3 second if it is it means pc was not at sleep
                               *** you can manipulate and have for example 1 second = 1000ms */
                    socket_write($client,encode("You are active! your pc is awakend"));
                    $_SESSION['prev_time'] = $jsTime; /** saving newly sent time as previous time for future testing whcih will happen in two seconds in our case*/
                }else { /** if it is more than 3 seconds it means that javascript setInterval function was paused and resumed after 3 seconds 
                            ** So it means that it was at sleep because when your PC is at sleep/suspended/hibernate mode setINterval gets pauesd */
                    socket_write($client,encode("You are not active! your pc is at sleep"));
                    $_SESSION['prev_time'] = $jsTime;
                }
            }else { /** if we have not saved the previous time in session save it  */
                $_SESSION['prev_time'] = $jsTime;
            }

            print_r($_SESSION);

           /*
        **** end of Main section for detectin sleep or not **
        */ 


        }
    }
} while (true);

// close sockets
socket_close($client);
socket_close($socket);
$client = null;
$flag_handshake = false;

function handshake($client, $headers, $socket) {

    if (preg_match("/Sec-WebSocket-Version: (.*)\r\n/", $headers, $match))
        $version = $match[1];
    else {
        print("The client doesn't support WebSocket");
        return false;
    }

    if ($version == 13) {
        // Extract header variables
        if (preg_match("/GET (.*) HTTP/", $headers, $match))
            $root = $match[1];
        if (preg_match("/Host: (.*)\r\n/", $headers, $match))
            $host = $match[1];
        if (preg_match("/Origin: (.*)\r\n/", $headers, $match))
            $origin = $match[1];
        if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $headers, $match))
            $key = $match[1];

        $acceptKey = $key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
        $acceptKey = base64_encode(sha1($acceptKey, true));

        $upgrade = "HTTP/1.1 101 Switching Protocols\r\n".
            "Upgrade: websocket\r\n".
            "Connection: Upgrade\r\n".
            "Sec-WebSocket-Accept: $acceptKey".
            "\r\n\r\n";

        socket_write($client, $upgrade);
        return true;
    } else {
        print("WebSocket version 13 required (the client supports version {$version})");
        return false;
    }
}

function unmask($payload) {
    $length = ord($payload[1]) & 127;

    if ($length == 126) {
        $masks = substr($payload, 4, 4);
        $data = substr($payload, 8);
    }
    elseif($length == 127) {
        $masks = substr($payload, 10, 4);
        $data = substr($payload, 14);
    }
    else {
        $masks = substr($payload, 2, 4);
        $data = substr($payload, 6);
    }

    $text = '';
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i % 4];
    }
    return $text;
}

function encode($text) {
    // 0x1 text frame (FIN + opcode)
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if ($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)$header = pack('CCS', $b1, 126, $length);
    elseif($length >= 65536)
    $header = pack('CCN', $b1, 127, $length);

    return $header.$text;
}

দ্রষ্টব্য এটি পড়ুন: $new_timeপরিবর্তনশীল $jsTimeকোড হয়

ফোল্ডারটি তৈরি করুন এবং পিএইচপি সকেটটি কমান্ডের সাহায্যে চালানো ফাইলগুলিতে এটি অনুলিপি করুন এবং পেস্ট করুন: পিএইচপি -f সার্ভার_সকেট.এফপি লোকালহোস্টে যান এবং বার্তাটি দেখতে এটি খোলা কনসোলটি পরীক্ষা করুন এটি "আপনি সক্রিয়" বা "আপনি সক্রিয় নন" বলবে (আপনি যখন ঘুম থেকে আসেন); আপনার এক্সিকিউটিনটি ঘটবে যখন ব্যবহারকারীরা ঘুম থেকে আসবেন না যখন তারা যখন ঘুমের কারণ হয় সেই মুহুর্তে পেজফাইলে (উইন্ডোজ) বা অদলবদল (লিনাক্স) এ সমস্ত কিছু ক্যাশে থাকে


ফোল্ডার তৈরি এবং মাত্র কপি এবং পেস্ট করুন ফাইলের মধ্যে এই কমান্ড দিয়ে পিএইচপি সকেট সঞ্চালন করুন: পিএইচপি -f server_socket.php যেতে স্থানীয় হোস্ট এবং পরীক্ষা এটি খোলা কনসোল বার্তা দেখতে এটা বলতে হবে "আপনি কি সক্রিয়" বা "আপনি সক্রিয় নয়" (আপনি যখন ঘুম থেকে আসেন); আপনার এক্সিকিউটিনটি ঘটবে যখন ব্যবহারকারীরা ঘুম থেকে আসবেন না যখন তারা ঘুমের কারণ হতে পারে সেই মুহুর্তে পেজফাইলে (উইন্ডোজ) বা অদলবদলে (লিনাক্স)
ক্যাটো হয়ে থাকে

0

আমি মনে করি আমার একটি ধারণা আছে, আপনি ব্যাংক লগইন / লগআউট সিস্টেম কীভাবে কাজ করে সে সম্পর্কে আপনি অনেক আলোচনা করেছেন।

কেস -১: ব্যবহারকারী সক্রিয় থাকলে সীমাহীন সময়ের জন্য ব্যবহারকারীর কাছে ওয়েবপৃষ্ঠার অ্যাক্সেস

যখনই ব্যবহারকারী লগ ইন করেছেন, আপনার ব্যাকএন্ডে একটি টাইমার শুরু করুন (যা চান সময় সীমা সেট করুন), আসুন 15 মিনিট বলুন। এখন এর মানে কি ?? এর অর্থ যদি ব্যবহারকারী ওয়েবপৃষ্ঠায় কোনও ক্রিয়াকলাপ না করেন তবে আমরা তাকে লগ আউট করব।

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

ব্যবহারকারী যদি তাদের পিসি ঘুমের উপরে রাখেন তবে টাইমার পুনরায় সেট হবে না এবং টাইমার শেষ হয়ে গেলে আপনি সেশনটি অবৈধ করতে পারবেন।

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

এটি তোমাকে সাহায্য করবে বলে আশা করি। আপনার যদি কোন প্রশ্ন থাকে তবে আমাকে জানান।


-1

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

কম্পিউটারকে 15-এরও বেশি সময় ধরে ঘুমিয়ে রাখা হয়েছে কিনা তা উদাহরণের ধাক্কা। দয়া করে নোট করুন আপনি যখন কম্পিউটারটি ঘুমানোর জন্য রাখেন তখন সমস্ত প্রসেসরের ধারণাটি আরও 15s লাগবে। (যখন আমার পিসিতে পরীক্ষা করা হয়)।

(function() {
    this.SleepTimer = function() {
        // console.log('sleep timer initiated');
        // Create global element references
        this.sleepTimer = null;
        this.maxTime = null;
        this.curDate = null;
        this.newDate = null;
        this.timer = null;
        this.timeInterval = 1000;

        this.sleepTimer = new CustomEvent("sleepTimer", {
		    "detail": {
		    	"maxTime":this.maxTime,
				"idelFor": this.newDate - this.curDate,
				"timer": this.timer
			}
		});

        // Define option defaults
        var defaults = {
            maxTime: 10000,
            timeInterval: 1000,
            autoStart: true,
            console: false,
            onStart: null,
            onIdel: null
        }
        // Create options by extending defaults with the passed in arugments
        if (arguments[0] && typeof arguments[0] === "object") {
            this.options = extendDefaults(defaults, arguments[0]);
        }
        if (this.options.timeInterval) {
            this.timeInterval = Math.max(1000, this.options.timeInterval);
            this.maxTime = Math.max(this.options.maxTime, 10000);
        } else {
        	this.options = defaults;
        }

        if(this.options.autoStart === true) this.start()
        // Utility method to extend defaults with user options
        
    }
    function extendDefaults(source, properties) {
        var property;
        for (property in properties) {
            if (properties.hasOwnProperty(property)) {
                source[property] = properties[property];
            }
        }
        return source;
    }
    SleepTimer.prototype.start = function(){
        var _ = this;
    	this.options.onStart()
        this.curDate = Date.now();

        this.timer = setInterval(function() {
            _.newDate = Date.now();
            var diff = _.newDate - _.curDate;

            // for debugging
            if(_.options.console && diff > _.timeInterval){
            	console.log('Your PC was idel for ' + diff / 1000 + 's of ' + _.maxTime /1000 + 's. TimeInterval is set to ' + _.timeInterval / 1000 + 's');
            }
            
            if (diff < _.maxTime) {
                _.curDate = _.newDate;
            } else {
            	_.options.onIdel();
                // alert('You have been idle for ' + diff / 1000 + 's');
                clearTimeout(_.timer);
            }
        }, this.timeInterval); // seconds
    }
}());

var sleepTimer = new SleepTimer({
	maxTime: 15000,
	console: true,
	onStart: function(){
		console.log('sleepTimer started.');
	},
	onIdel: function(){
		alert('Your session expired! Please login again.');
	}
});


দয়া করে ব্যাখ্যা করুন কেন এটি কাজ করে না, যদি এটি আপনার ক্ষেত্রে না ঘটে
ল্যাসিথ্ডস

-1

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

প্রথমত কোনও নিষ্ক্রিয়তা লগআউট কার্যকর করার সাথে সাথে আপনাকে এটি সার্ভারের পাশেই করতে হবে, যেন কেউ কেবল তাদের কম্পিউটার বন্ধ করে দেয়, সামনের-শেষ ওয়েবসাইটটি তাদের লগ আউট করে না। আমি ACTIVEব্যবহারকারীদের ধারণাটি ব্যবহার করেছি । তাদের ব্যবহারকারীদের সফলভাবে অনুমোদন, আমি Redis 15 মিনিট সময় TTL এর সাথে একটি মূল সহ একটি এন্ট্রি সংরক্ষণ যখন username& মান ACTIVE(যদি আপনি একই সময়ে একটি প্রদত্ত ব্যবহারকারী জন্য একাধিক সেশন অনুমতি দিতে চান এটা হতে পারে ব্যবহারকারীর নাম + সেশনআইডি)।

আমার কাস্টম কর্তৃপক্ষগুলিতে যখন কোনও ব্যবহারকারী থাকে ACTIVEএবং তাদের বৈধ টোকেন থাকে, আমি তাদের সুরক্ষিত সংস্থানটিতে অ্যাক্সেস দেই এবং সবচেয়ে গুরুত্বপূর্ণ, আমি রেডিসে username& এর সাথে আরও একটি রাখি ACTIVE

যখনই ব্যবহারকারী লগ আউট করে, আমি তাদের আমার পরিচয় ব্যবস্থাপনা সমাধান (কগনিটো) এ লগ আউট করি এবং আমি তাদের হিসাবে চিহ্নিত করি INACTIVE। মনে রাখবেন যে কোনও ব্যবহারকারী যদি 15 মিনিটের মধ্যে API এ আঘাত না করে তবে ACTIVEতাদের আর ব্যবহারকারীর নামের বিপরীতে এন্ট্রি থাকতে হবে না এবং তারা আর এপিআই অ্যাক্সেস করতে পারবেন না এবং আবার সাইন ইন করতে হবে, যার জন্য তারা পুনঃনির্দেশিত হবে।

এই পদ্ধতির সাথে বিবেচনা করার মতো অনেকগুলি বিষয় রয়েছে, একটি কারণে প্রায়শই লেখকরা কিছু সময়ের জন্য ফলাফলকে ক্যাশে করেন এবং যদি বলেন যে উদাহরণ হিসাবে আপনি 5 মিনিটের জন্য ফলাফলটি ক্যাশে করেন, তবে আপনি ব্যবহারকারী 10 মিনিটের মধ্যে আপনার ব্যবহারকারী হিসাবে লগ ইন করতে পারেন অনুমোদকের পরিবর্তে ক্যাশে আঘাত করতে পারে যা ACTIVEএন্ট্রি রিফ্রেশ করে না ।

এটিও গুরুত্বপূর্ণ যে আপনি যদি কোনও প্রদত্ত ব্যবহারকারীর ACTIVEপক্ষে প্রচুর উপলব্ধ থাকে এবং আপনি ব্যর্থতার ক্ষেত্রে দ্রুত পুনরুদ্ধার করতে পারেন তবে আপনি যা সঞ্চয় করতে ব্যবহার করেন তা নিশ্চিত করে নিন ।

ক্যাশে স্টোরটি এইভাবে ব্যবহারের পদ্ধতির সাথে টোকেন অবৈধকরণ কীভাবে রাষ্ট্রবিহীন অনুমোদনের প্রোটোকল যেমন ওআউথ 2-তে পুনঃনির্মাণ করা হয় তার সমান।

আমরা এখন কয়েক মাস ধরে এই পদ্ধতির ব্যবহার করছি, এটি আমাদের পক্ষে ঠিক কাজ করে বলে মনে হচ্ছে, এটি সামলাতে কিছুটা বিরক্তিকর প্রয়োজন হতে পারে, আমি এডাব্লুএস জগতে আশা করতাম যে ব্যবহারের জন্য প্রস্তুত থাকব? এটির জন্য বাক্সের সমাধানটি কিন্তু তেমন কিছু বলার নেই।


এই যেখানে আমাদের প্রয়োজন প্রাথমিকভাবে থেকে এসেছেন, আমাদের অ্যাপ্লিকেশনটি একটি আর্থিক সেবা ভিত্তিক পণ্য, এবং আমরা প্রয়োজন হিসাবে এই বাস্তবায়ন ছিল; আমরা একটি কলম পরীক্ষা (বেঁচে।
Snickers3192
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.