সেশন.এব্যান্ডন () এবং সেশন.ক্লেয়ার () এর মধ্যে পার্থক্য কী?


109

একটি অধিবেশন ধ্বংস এবং এর মানগুলি মুছে ফেলার মধ্যে পার্থক্য কী? আপনি দয়া করে এটি প্রদর্শিত উদাহরণ দিতে পারেন?

আমি এই প্রশ্নটি অনুসন্ধান করেছি, তবে মোট উত্তরটি ধরব না। কিছু উত্তর:

  • Session.Abandon() অধিবেশন ধ্বংস
  • Session.Clear() শুধু সমস্ত মান মুছে ফেলা

একটি বন্ধু আমাকে এই বলেছিল:

সেশনটি সাফ করা সেশনটি আনসেট করবে না, এটি এখনও ব্যবহারকারীর জন্য একই আইডিতে রয়েছে তবে মানগুলি কেবল সাফ করা হয়েছে।

পরিত্যাগটি অধিবেশনটিকে পুরোপুরি ধ্বংস করে দেবে, এর অর্থ এই যে আপনি সেই ব্যবহারকারীর জন্য অধিবেশনটিতে আরও কোনও মান সংরক্ষণ করার আগে আপনাকে একটি নতুন সেশন শুরু করতে হবে।

নীচের কোডটি কাজ করে এবং কোনও ব্যতিক্রম ছুঁড়ে না।

Session.Abandon();
Session["tempKey1"] = "tempValue1";

আপনি যখন একটি সেশন পরিত্যাগ করবেন, আপনি (বা বরং ব্যবহারকারী) একটি নতুন সেশনআইডি পাবেন

আমি যখন সেশনটি পরীক্ষা করি তখন আমি সেশনটি ছেড়ে দিলে কোনও পরিবর্তন হয় না।

আমি কেবল একটি পার্থক্য খুঁজে পাই: ঘটনা session.Abandon()উত্থাপন করেSession_End


5
সেশন.সামান্য তাত্ক্ষণিকভাবে আইটেমগুলি সরিয়ে ফেলুন তবে সেশন.এব্যান্ডন বর্তমান অনুরোধের শেষে অধিবেশনটি পরিত্যাগ করার চিহ্নিত করে।
RepDbg

উত্তর:


147

স্পষ্ট - সেশন-স্টেট সংগ্রহ থেকে সমস্ত কী এবং মানগুলি সরান।

পরিত্যাগ - একটি সেশনে সঞ্চিত সমস্ত বস্তু সরিয়ে দেয়। আপনি যদি বিস্মৃত পদ্ধতিটি স্পষ্টভাবে কল না করেন তবে সার্ভার এই বিষয়গুলি সরিয়ে ফেলবে এবং সেশনটির সময় শেষ হয়ে গেলে সেশনটি নষ্ট করে দেয়।
এটি সেশন_এন্ডের মতো ইভেন্টগুলিও উত্থাপন করে ।

সেশন.ক্লেয়ারকে তুলনামূলকভাবে সমস্ত বই শেল্ফ থেকে অপসারণের সাথে তুলনা করা যেতে পারে , যখন সেশন.এব্যান্ডন পুরো শেল্ফটি ফেলে দেওয়ার মতো

তুমি বলো:

আমি যখন সেশনটি পরীক্ষা করি তখন আমি সেশনটি ছেড়ে দিলে কোনও পরিবর্তন হয় না।

আপনি কেবলমাত্র একটি অনুরোধের মধ্যে এটি করার সময় এটি সঠিক ।
পরবর্তী অনুরোধে অধিবেশনটি আলাদা হবে। তবে সেশন আইডি আবার ব্যবহার করা যেতে পারে যাতে আইডিটি একই থাকে।

আপনি যদি সেশনটি ব্যবহার করেন তবে ক্লিয়ার করুন আপনার অনেক অনুরোধে একই সেশন থাকবে।

সাধারণত, বেশিরভাগ ক্ষেত্রে আপনাকে সেশন.ক্লেয়ার ব্যবহার করা দরকার।
আপনি যদি নিশ্চিত হন যে ব্যবহারকারী আপনার সাইটটি ছেড়ে চলেছে তবে আপনি সেশন.এব্যান্ডন ব্যবহার করতে পারেন।

তাই পার্থক্য ফিরে:

  1. পরিত্যাগ সেশন_এন্ড অনুরোধ উত্থাপন করে।
  2. পরিষ্কার পরিষ্কারভাবে আইটেমগুলি সরিয়ে দেয়, পরিত্যাগ হয় না।
  3. পরিত্যাগ সেশনস্টেট অবজেক্ট এবং তার আইটেমগুলি প্রকাশ করে যাতে এটি সংস্থানগুলি মুক্ত করার জন্য সংগ্রহ করা আবর্জনা বানাতে পারে। ক্লিয়ার সেশনস্টেট এবং সংস্থানগুলি এর সাথে যুক্ত রাখে।

এবং যদি আমি সেশন ক্লেয়ারকে কল করি () এটি আবার আপনি বলছেন ures না? (সব অন্য উত্থাপন Session_End ইভেন্ট)
খিড়কি

সেশন.ক্লেয়ারটি সেশন থেকে কেবল আইটেমগুলি সরিয়ে ফেলবে। বেশি না. আপনি এটি যতবার প্রয়োজন কল করতে পারেন।
Dmytrii নাগিরনিয়াক

অ্যান্থনি ডাব্লু জোন্স, আপনি ঠিক "ধ্বংস" বলতে ভুল বলছেন। সেশন থেকে অবজেক্টগুলি অপসারণ করা ভাল Bet তবে সেশন.ক্লেয়ারগুলি বস্তুগুলিও ধ্বংস করে না, এটি সেশন থেকে তাদের সরিয়ে দেয় যাতে তারা সংগ্রহ করা আবর্জনা হতে পারে। এছাড়াও, কমপ্লেক্স অবজেক্টগুলি সঞ্চয় করার প্রস্তাব দেওয়া হয় না, অন্যথায় আমি এটি সূক্ষ্ম বিবেচনা করি।
Dmytrii Nagirniak

@ দিমিত্রি: কেন "কমপ্লেক্স অবজেক্টগুলি সংরক্ষণ করার প্রস্তাব দেওয়া হয় না"?
কামারে

5
@ অ্যাডস আমি সম্মত হই, যদিও আমি তা বলে তা প্রসারিত করব যে তাড়াতাড়িSession.Clear তাক থেকে সমস্ত বই অপসারণের সাথে তুলনা করা যেতে পারে , যদিও এটি "সম্পূর্ণ শেল্ফটি ফেলে দিন এবং আপনার কাজ শেষ হয়ে গেলে আমাকে জানান " বলার মতোই । Session.Abandon
WynandB

20

আপনি যখন Abandon()একটি সেশন করবেন, আপনি (বা বরং ব্যবহারকারী) একটি নতুন সেশনআইড পাবেন (পরবর্তী অনুরোধে)। আপনি যখন Clear()একটি সেশন করবেন, সমস্ত সঞ্চিত মান সরিয়ে ফেলা হবে, তবে সেশনআইড অক্ষত থাকবে।


3
ধন্যবাদ। তবে ম্যাটিউ ম্যাকডোনাল্ডস বইয়ের সাথে সমালোচনা করে এটি একই সেশন আইডি ব্যবহার করতে পারে। আমি এর অর্থ হ'ল যদি কনফিগারেশন / সিস্টেম. ওয়েবে / সেশনস্টেট উপাদানগুলিতে পুনরায় জেনারেটেড এক্সপায়ারডসেশনআইডি অ্যাট্রিবিউটটি মিথ্যা এএসপি হয়। নেট পুরানো সেশন আইডি ব্যবহার করে
ব্যাকডোর

2
@ হ্যান্স কেষ্টিং যখন বিসর্জন ডেকে আনা হবে তখন সে নতুন একটি সেশন আইডি পাবে না। একটি নতুন সেশন আইডি পেতে তাকে স্পষ্টতই ASPNET_SessionID কুকি সেট করতে হবে।
জো

9

এই সাজানোর উপরে বিভিন্ন প্রতিক্রিয়া দ্বারা আচ্ছাদিত, কিন্তু প্রথমবার আমি এই নিবন্ধে পড়া আমি একটি গুরুত্বপূর্ণ সত্য, যা আমার কোডে একটি ক্ষুদ্র বাগ নেতৃত্বে মিস ...

Session.Clear() সমস্ত কীগুলির মানগুলি সাফ করবে কিন্তু সেশন সমাপ্ত ইভেন্টটিকে আগুন লাগিয়ে দেবে না।

Session.Abandon()বর্তমান অনুরোধের মানগুলি সাফ করবে না। যদি অন্য পৃষ্ঠার জন্য অনুরোধ করা হয় তবে মানগুলি সেইটির জন্যই চলে যাবে। তবে, ইভেন্টটি ফেলে দিন throw

সুতরাং, আমার ক্ষেত্রে (এবং সম্ভবত আপনার?), আমার Clear()অনুসরণ করা প্রয়োজন Abandon()


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

@RepDbg আসলে আমি একমত নই Session.Abandon ()। ক্লায়েন্টকে একটি নতুন সেশন আইডি দেয়। Session.clear অধিবেশন সম্পর্কে সার্ভারে সব তথ্য মুছে ফেলা হবে তাই কোনও অন্যান্য ব্যবহারকারীদের NRC সাথে একমত can.I
মীখা Armantrout

@ মিকাঃ আরমান্ট্রাউট আমি আপনার যুক্তি অনুসরণ করছি না। কেন সেশন.ক্লেয়ার () দিয়ে একটি সেশন সাফ করুন, তারপরে সেশন ডেকে আন্ডারডাউন () কল করুন যা কেবল সেশনটি সাফ করে না, বরং এটি পুরোপুরি হ্রাস করে? এছাড়াও সেশন.এব্যান্ডন () ক্লায়েন্টকে নতুন সেশন আইডি দেয় না। পরবর্তী অনুরোধটি হবে, তবে সেই অনুরোধটির পূর্ণতা নয় যা সেশন বলে।
RepDbg

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

6

এই কোডটি কাজ করে এবং কোনও ব্যতিক্রম ছুঁড়ে ফেলবে না:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

উদাহরণস্বরূপ, নিম্নলিখিত স্ক্রিপ্টে, তৃতীয় লাইনটি মেরি মান প্রিন্ট করে। কারণ সার্ভারটি স্ক্রিপ্টটি প্রক্রিয়া শেষ না করা পর্যন্ত সেশন অবজেক্টটি ধ্বংস হয় না।

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

যদি আপনি পরবর্তী ওয়েব পৃষ্ঠায় ভেরিয়েবল MyName অ্যাক্সেস করেন তবে এটি খালি। এর কারণ হ'ল পূর্ববর্তী উদাহরণটি সহ পৃষ্ঠাটি প্রসেসিং শেষ করার সাথে সাথে MyName পূর্ববর্তী সেশন অবজেক্টের সাথে ধ্বংস হয়েছিল।

এমএসডিএন সেশন থেকে


3

একটি সেশন সাফ করা সেখানে সঞ্চিত মানগুলি সরিয়ে দেয়, তবে আপনি এখনও সেখানে নতুন যুক্ত করতে পারেন। সেশনটি ধ্বংস করার পরে আপনি সেখানে নতুন মান যুক্ত করতে পারবেন না।


ধন্যবাদ তবে এটি কাজ করে: (আপনার ধারণার সাথে অসামঞ্জস্যপূর্ণ) সেশন.এব্যান্ডন (); অধিবেশন ["tempKey1"] = "টেম্পালিউ 1"; Response.Write (সেশন [ "tempKey1"] ToString ()।);
পিছনের দরজা

এটি ঘটে কারণ আপনি নিজের পৃষ্ঠাটি রিফ্রেশ করার পরে সেশনটি ধ্বংস হয়ে যাবে। সেশন আইডি এটি (সাধারণত) একটি কুকিতে সঞ্চিত থাকে।
রায়েল

আমি বুঝতে পারি না মানে আমি সেশন কল করার পরে bandআপন্ডোন () তবুও আমি এতে মান যুক্ত করতে পারি। (এমনকি যদি পৃষ্ঠাটি বার বার পোস্ট করা হয় তবে)।
ব্যাকডোর

1
আপনার আইডিটি নষ্ট হয়ে যাওয়ার পরে অটোরেজেনেটে সেট করতে পারেন। সুতরাং আপনি যখন বিনষ্ট সেশনে একটি মান নির্ধারণ করবেন তখন নতুন সেশনটি স্বয়ংক্রিয়ভাবে উত্পন্ন হবে।
রায়েল

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

3

সেশন স্ট্যাটাস সংগ্রহ থেকে মুছে ফেলা কী বা মানগুলি মুছুন ..

সেশন থেকে এটি সরিয়ে বা সরিয়ে অধিবেশন বিষয়গুলি পরিত্যাগ করুন ..


1
Session.Abandon() 

পুরো অধিবেশনটিকে ধ্বংস / হত্যা করবে।

Session.Clear()

সেশন ডেটা সরিয়ে / সাফ করে (যেমন বর্তমান অধিবেশন থেকে কীগুলি এবং মানগুলি) তবে সেশনটি জীবিত থাকবে।

সেশন.এবডন () পদ্ধতির সাথে তুলনা করুন, সেশন.ক্লেয়ার () নতুন সেশন তৈরি করে না, এটি সেশনে সমস্ত পরিবর্তনশীলকে NULL করে তোলে।

যতক্ষণ না ব্রাউজারটি বন্ধ না হয় সেশন আইডি উভয় ক্ষেত্রেই একই থাকবে।

Session.RemoveAll()

এটি সেশন-স্টেট সংগ্রহ থেকে সমস্ত কী এবং মান সরিয়ে দেয়।

Session.Remove()

এটি সেশন-স্টেট সংগ্রহ থেকে একটি আইটেম মুছে ফেলে।

Session.RemoveAt()

এটি সেশন-স্টেট সংগ্রহ থেকে নির্দিষ্ট সূচীতে একটি আইটেম মুছে ফেলে।

Session.TimeOut()

এই বৈশিষ্ট্যটি প্রয়োগের জন্য সেশন অবজেক্টকে নির্ধারিত সময়সীমা নির্দিষ্ট করে। (সময়টি কয়েক মিনিটের মধ্যে নির্দিষ্ট করা হবে)।

যদি সময়সীমার মধ্যে যদি ব্যবহারকারী কোনও পৃষ্ঠাকে রিফ্রেশ না করে বা অনুরোধ না করে তবে সেশনটি শেষ হয়।


0

সেশনিডের অস্তিত্বই সেশন ফিক্সেশন আক্রমণের কারণ হতে পারে যা পিসিআই সম্মতিতে অন্যতম পয়েন্ট। অধিবেশন অপসারণ এবং সেশন স্থিরকরণ আক্রমণ থেকে উত্তরণের জন্য, এই সমাধানটি পড়ুন - কীভাবে এএসপি.নেটে সেশন স্থিরকরণের দুর্বলতা এড়ানো যায়?


0

আমি মনে করি এটি ব্যবহার Session.Clear()করার চেয়ে ব্যবহার করা সহজ হবে Session.Abandon()

কারণ পরে কল করার পরে সেশনগুলিতে মানগুলি এখনও বিদ্যমান তবে পূর্বকে কল করার পরে সরিয়ে ফেলা হয়।


0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

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