ব্রাউজার-ট্যাবগুলিতে সেশনগুলির পার্থক্য কীভাবে করবেন?


135

জেএসপি এবং সার্লেটস ব্যবহার করে জাভাতে প্রয়োগ করা একটি ওয়েব-অ্যাপ্লিকেশনটিতে; যদি আমি ব্যবহারকারীর সেশনে তথ্য সঞ্চয় করি তবে একই তথ্যটি একই ব্রাউজার থেকে সমস্ত ট্যাব থেকে ভাগ করা হয়। ব্রাউজার-ট্যাবগুলিতে সেশন আলাদা করতে কীভাবে? এই উদাহরণে:

<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>

এই কোডটি একটি জেএসপি পাতায় ( testpage.jsp) অনুলিপি করুন, সার্ভারে কোনও ওয়েব অ্যাপ্লিকেশনের বিদ্যমান প্রসঙ্গে এই ফাইলটি স্থাপন করুন (আমি অ্যাপাচি টমক্যাট ব্যবহার করি), তারপরে সঠিক ইউআরএল ( localhost/context1/testpage.jsp) ব্যবহার করে একটি ব্রাউজার (এফএফ, আই 7 বা অপেরা) টাইপ করুন, টাইপ করুন আপনার নাম ইনপুট এবং ফর্ম জমা দিন। তারপরে একই ব্রাউজারে একটি নতুন ট্যাব খুলুন এবং তারপরে আপনি নতুন ট্যাবে আপনার নামটি (সেশন থেকে পান) দেখতে পাবেন। ব্রাউজার-ক্যাশে সম্পর্কে সতর্ক থাকুন, কখনও কখনও মনে হয় এটি ঘটে না তবে এটি ক্যাশে রয়েছে, দ্বিতীয় ট্যাবটি রিফ্রেশ করুন।

ধন্যবাদ।


সম্পর্কিত: stackoverflow.com/questions/4479995/...
Bozho

1
এটি ব্যবহারকারীকে করার একটি জিনিস: আইই ওপেন করুন, "ফাইল-> নতুন সেশন" এ ক্লিক করুন
স্টেফান স্টিগার 3:33

3
@ গুপ্তচর, আপনার সমাধানটি জেনেরিক সমাধান নয় (অন্যান্য ব্রাউজারগুলিতে কাজ করে না) এবং সবচেয়ে গুরুত্বপূর্ণ, এটি ব্যবহারকারী বান্ধব নয় (ব্যবহারকারীরা সেশন সম্পর্কে জানেন না)।
অরিওল টেরাদাস

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

উত্তর:


92

আপনি এইচটিএমএল 5 সেশন স্টোরেজ (উইন্ডো.সেসিয়েন্স স্টোরেজ) ব্যবহার করতে পারেন। আপনি একটি এলোমেলো আইডি উত্পন্ন করবেন এবং ব্রাউজার ট্যাব প্রতি সেশনে সঞ্চয় করবেন save তারপরে প্রতিটি ব্রাউজার ট্যাবের নিজস্ব আইডি থাকে।

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


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

21
দ্রষ্টব্য, ক্রোমের "সদৃশ ট্যাব" বৈশিষ্ট্যটি ব্যবহার করার সময় আইডিটি নকল হবে। এটি সাধারণত কোনও সমস্যা নয়, তবে তার মাধ্যমে চিন্তা করা উচিত।
জোশিহাদানিয়েলস

আপনি যখন ক্রোম বা ফায়ারফক্সে কোনও ট্যাব "নকল করুন" বাদে। এই ক্ষেত্রে, সেশনস্টোরেজ অনুলিপি করা হয়।
টিয়াগো ফ্রেইটাস লিয়াল

@ গঞ্জালো গ্যালোটি: সেশন সার্ভার-সাইড হলে এটি কীভাবে আমাকে সহায়তা করবে? )))
স্টেফান স্টেইগার

@StefanSteiger। তারপরে আপনি ব্রাউজারট্যাব আইডিটি পাঠাতে পারেন (সেশন স্টোরেজে সংরক্ষিত) আপনার অ্যাজাক্স কল দিয়ে। সার্ভার সাইডে আপনার কাস্টম লজিকের প্রয়োজন হবে, কারণ ওয়েবসেশনটি একই। তবে আপনি ট্যাবে সেশন অবজেক্ট সহ একটি হ্যাশম্যাপ তৈরি করতে পারেন।
গনজালো গ্যালোটি

23

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

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

আপনি যাইহোক কি করতে চেষ্টা করছেন? আপনি কেন ট্যাবগুলিতে পৃথক সেশন করতে চান? সম্ভবত সেশন ব্যবহার না করেই আপনার লক্ষ্য অর্জনের কোনও উপায় আছে?

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


6
এটি একটি বড় অ্যাপ্লিকেশন যা ব্যবহারকারীর তথ্য এবং পরিবেশকে রাখে। যখন কেউ পৃথক পৃথক ট্যাবগুলিতে পরীক্ষার জন্য বা ভিন্ন ভিন্ন ভূমিকার জন্য পৃথক ব্যবহারকারীদের সাথে লগইন করে, তখন সে ট্যাবগুলি থেকে তথ্য অতিক্রম করে।
ওরিওল টেরাদাস

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

16

উইন্ডো.নাম জাভাস্ক্রিপ্ট সম্পত্তি, একমাত্র জিনিস যা ট্যাব ক্রিয়াকলাপ জুড়ে থাকবে, তবে স্বাধীন থাকতে পারে (ইউআরএল গাফের পরিবর্তে)।



3
ব্যবহারকারী "নতুন ট্যাবে খুলুন" বেছে নেওয়ার সময় সেশন
স্টোরেজটি

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

15

আপনার উচিত হবে না।আপনি যদি এই জাতীয় কাজটি করতে চান তবে আপনাকে ফ্লাইতে ইউআরএল লিখে আপনার অ্যাপ্লিকেশনটির একক উদাহরণ ব্যবহার করতে বাধ্য করতে হবে যেন একইভাবে সেশনআইডি (সেশনড নয় এটি কার্যকর হবে না) আইডি ব্যবহার করুন এবং প্রতিটি ইউআরএলে পাস করুন pass

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


9
এটি একটি বড় অ্যাপ্লিকেশন যা ব্যবহারকারীর তথ্য এবং পরিবেশকে রাখে। যখন কেউ পৃথক পৃথক ট্যাবগুলিতে পরীক্ষার জন্য বা ভিন্ন ভিন্ন ভূমিকার জন্য পৃথক ব্যবহারকারীদের সাথে লগইন করে, তখন সে ট্যাবগুলি থেকে তথ্য অতিক্রম করে।
ওরিওল টেরাদাস

38
পুরানো উত্তর আমি জানি, তবে গুগল মেল আপনাকে ট্যাব প্রতি বিভিন্ন অ্যাকাউন্ট রাখতে দেয় এবং এটি কোনও "সম্পূর্ণ অব্যর্থ অ্যাপ্লিকেশন" নয়
জর্জ

2
@ জর্জি, উত্তরটি এখনও ঠিক আছে, এবং উদাহরণস্বরূপ আপনি ইউআরএল নম্বরটিতে দেখতে পাবেন কুকিজের মধ্যে থাকা অ্যাকাউন্টগুলির সূচি উপস্থাপন করে, গুগল মেল সমস্ত কুকি সঞ্চিত করে এবং ইউআরএল অনুসারে একটি নির্বাচন করে।
এমএমএইচএম

5
উত্তরটি এখনও সঠিক কিনা তা নিশ্চিত নন, আপনি পরিষ্কারভাবে এটি করতে পারেন। Gmail এটি করে। এটি কীভাবে এটি করে, এটি মার্জিত নাও হতে পারে তবে এটি কাজ করে এবং এটি গুরুত্বপূর্ণ
জর্জ

2
পুরানো উত্তর তবে আমি যুক্ত করতে পারি যে হোয়াটসঅ্যাপ এবং টেলিগ্রাম আপনাকে একই সাথে দুটি ট্যাব খোলার অনুমতি দেয় না। এটি তাদের ব্যবহারযোগ্য করে তুলবে না
চার্লি

13

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

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

এই পদ্ধতির জন্য একটি সতর্কতা: আপনি কোনও উইন্ডোতে সাধারণ AJAX কলগুলি (যেমন, আপনার সেশনের উপর নির্ভর করে) ঘটতে পারে না যার ফোকাস নেই (উদাহরণস্বরূপ যদি আপনার কোনও কলটি দেরি হওয়ার পরে ঘটত) আপনি তার আগে ম্যানুয়ালি একটি এজেএক্স পুনরায় লগইন কল করেন। সুতরাং সত্যই আপনাকে যা করতে হবে তা হ'ল স্থানীয়আস্টোরেশন.কন্ট্রালি_লগড_ইন_উজার_আইডি === উইন্ডো.ইউর অ্যাপন নেমস্পেস.উজার_আইডি নিশ্চিত করার জন্য প্রথমে আপনার এজ্যাক্স ফাংশনটি যাচাই করা উচিত এবং যদি তা না হয় তবে এজেএক্সের মাধ্যমে প্রথমে লগ ইন করুন।

অন্যটি হ'ল রেসের শর্তসমূহ: যদি আপনি উইন্ডোজগুলিকে এটিকে বিভ্রান্ত করার জন্য দ্রুত দ্রুত স্যুইচ করতে পারেন তবে আপনি ভুল সেশনের অধীনে অজেক্স 1 তৈরি করে একটি রিলজিন 1-> রিলজিন 2-> অ্যাজ্যাক্স 1-> অ্যাজ্যাক্স 2 সিকোয়েন্সটি শেষ করতে পারেন। অ্যারেতে লগইন এজেএক্স অনুরোধগুলি ঠেলে এটিকে ঘিরে কাজ করুন এবং তারপরে স্টোরেজ এবং একটি নতুন লগইন অনুরোধ জারির আগে সমস্ত বর্তমান অনুরোধ বাতিল করে দিন।

উইন্ডো রিফ্রেশ করে দেখার জন্য সর্বশেষ গোটচা। যদি আপনি AJAX লগইন অনুরোধটি সক্রিয় থাকলেও সম্পূর্ণ না করে কেউ উইন্ডোটি রিফ্রেশ করে তবে এটি ভুল ব্যক্তির নামে সতেজ করা হবে। এই ক্ষেত্রে আপনি সম্ভাব্য মিক্সআপ সম্পর্কে ব্যবহারকারীকে সতর্ক করতে এবং পূর্বেই আনড্যান্ডার্ড ইভেন্টটি ব্যবহার করতে পারেন এবং বাতিলটিকে ক্লিক করতে অনুরোধ করতে পারেন, এরই মধ্যে একটি এজেএক্স লগইন অনুরোধটি পুনরায় প্রকাশ করে। এরপরে তারা অনুরোধটি জানার একমাত্র উপায় হ'ল অনুরোধটি শেষ হওয়ার আগে ওকে ক্লিক করে (বা দুর্ঘটনাক্রমে প্রবেশ / স্পেসবারে আঘাত করে, কারণ ঠিক আছে - দুর্ভাগ্যক্রমে এই ক্ষেত্রে - ডিফল্ট)) এই কেসটি হ্যান্ডেল করার অন্যান্য উপায় আছে যেমন F5 এবং Ctrl + R / Alt + R টিপুন সনাক্ত করা হচ্ছে যা বেশিরভাগ ক্ষেত্রে কাজ করবে তবে ব্যবহারকারী কীবোর্ড শর্টকাট পুনরায় কনফিগারেশন বা বিকল্প ওএস ব্যবহারের দ্বারা ব্যর্থ হতে পারে। তবে বাস্তবে এটি সামান্যতম ঘটনা, এবং সবচেয়ে খারাপ পরিস্থিতি কখনও খারাপ হয় না: সম্মান সিস্টেমের কনফিগারেশনে আপনি ভুল ব্যক্তি হিসাবে লগ ইন করতে পারেন (তবে আপনি এটি স্পষ্ট করে তুলতে পারেন যে রঙ, শৈলী, বিশিষ্টভাবে প্রদর্শিত নাম, ইত্যাদি); একটি পাসওয়ার্ড কনফিগারেশনে, শেষ ব্যক্তিটি লস আউট বা তাদের সেশনটি ভাগ করে নেওয়ার জন্য তাদের পাসওয়ার্ডটি প্রবেশ করিয়েছিল বা এই ব্যক্তিটি যদি প্রকৃতপক্ষে বর্তমান ব্যবহারকারী হয় তবে তার কোনও লঙ্ঘন নেই।

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


6
+1 কারণ আপনি সত্যিকার অর্থে এটি ভাবতে সময় নিয়েছিলেন! :-) সমস্ত ক্যাভেটের দিকে তাকানো আপনি কেবল জানেন এটি একটি খারাপ ধারণা। এই স্টাফটি থেকে আমার শেখা পাঠগুলি হ'ল কোন ডেটা সেশনে যাওয়া উচিত এবং কোন ডেটা উচিত নয় তা সত্যই বুঝতে।
পিটার

10

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

সুতরাং সমাধানটি এলোমেলো সাবডোমেন ছিল।

23423.abc.com
242234.abc.com
235643.abc.com

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


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

@ ব্যবহারকারী 3534653: আমি পদ্ধতির পছন্দ করি। তবে আপনি বলেছিলেন "কোনও প্রোগ্রামিং জড়িত নেই"। তারপরে আপনি "সামান্য কোড পরিবর্তনের সাথে" বলতে যান। সুতরাং সত্যিই, একটু কোড পরিবর্তন প্রোগ্রামিং হয় না? ;) এছাড়াও, ডোমেনটি হার্ড-কোডড / কনফিগার করা আছে (সাধারণভাবে) আপনার ক্যানোনিকাল লিঙ্কগুলির সাথে একাধিক অ্যাপ্লিকেশন থাকলে এই পদ্ধতিটি কাজ করতে পারে না।
স্টিফান স্টেইগার

5

আমি এখানে সৎ হতে হবে। । । উপরের সমস্ত কিছুই সত্য হতে পারে বা নাও হতে পারে তবে এগুলি সবই ওয়ে seems খুব জটিল, অথবা না ঠিকানা বুদ্ধিমান কি ট্যাব ব্যবহৃত সার্ভার প্রান্তের হচ্ছে।

কখনও কখনও আমাদের ওসামের রেজার প্রয়োগ করা প্রয়োজন।

ওকামের পদ্ধতি এখানে: (না, আমি ওসাম নই, তিনি ১৩ 13৪ সালে মারা গিয়েছিলেন)

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

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

3) আপনার ফোকাস (এবং / অথবা মাউসওভার) ফাংশনে, এতে উইন্ডো.নাম দিয়ে একটি কুকি সেট করুন

4) যখন আপনাকে ট্যাব নির্দিষ্ট ডেটা পড়তে / লেখার প্রয়োজন হয় তখন আপনার সার্ভার দিক থেকে সেই কুকি মানটি পড়ুন।

মক্কেলের পক্ষে:

//Events 
$(window).ready(function() {generateWindowID()});
$(window).focus(function() {setAppId()});
$(window).mouseover(function() {setAppId()});


function generateWindowID()
{
    //first see if the name is already set, if not, set it.
    if (se_appframe().name.indexOf("SEAppId") == -1){
            "window.name = 'SEAppId' + (new Date()).getTime()
    }
    setAppId()
}

function setAppId()
{
    //generate the cookie
    strCookie = 'seAppId=' + se_appframe().name + ';';
    strCookie += ' path=/';

    if (window.location.protocol.toLowerCase() == 'https:'){
        strCookie += ' secure;';
    }

    document.cookie = strCookie;
}

সার্ভার পাশ (সি # - উদাহরণস্বরূপ)

//variable name 
string varname = "";
HttpCookie aCookie = Request.Cookies["seAppId"];
if(aCookie != null) {
     varname  = Request.Cookies["seAppId"].Value + "_";
}
varname += "_mySessionVariable";

//write session data 
Session[varname] = "ABC123";

//readsession data 
String myVariable = Session[varname];

সম্পন্ন.


1
আমি আপনার সহজ উত্তর এবং ওসামের রেজার রেফারেন্সটি সত্যিই পছন্দ করি। কেবলমাত্র দ্বিগুণ করতে চেয়েছিলেন যে এই সমাধানটি এখনও আপনার জন্য কাজ করছে।
জেফ মেরিনো

1
এটি লক্ষ্য করার মতো যে পৃষ্ঠাটি রিফ্রেশ করে যদি এটির সেশনটি রাখা হয় তবে এই পদ্ধতির কাজ হবে না। উইন্ডো.অ্যাসিওশনস্টোরেজ ব্যবহারের অন্য উত্তরে অন্য প্রস্তাবিত পদ্ধতির বিষয়টি আমার কাছে আরও যুক্তিযুক্ত বলে মনে হয়।
রোজেনফিল্ড

@ কুইজিবো এখনও আমার আবেদনে পুরোপুরি কাজ করে, হ্যাঁ। পৃষ্ঠাটি রিফ্রেশ করার জন্য, উইন্ডোটি ব্যবহার করে কিছু ব্রাউজারের পক্ষে এটি সত্য হতে পারে sessঅ্যাসেশন স্টোরেজ সমস্যাটি সমাধান করতে পারে, এটি চেষ্টা করে না
মাইক এ

3
"Se_appframe ()" ফাংশনটি কী?
AndreMiranda

Se_appframe কি ?
কিকিনেট

2

আপনি যখন কোনও একক পৃষ্ঠায় (যেমন। ব্রাউজারটি আপনার সমস্ত ট্যাবগুলির জন্য একই কুকিজ ব্যবহার করবে তাই আপনি কুকিগুলিতে যা কিছু রেখেছিলেন তা অনন্য হবে না


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

2

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

যদিও এটি মূলত জেএসএফকে লক্ষ্য করে, এটি দেখুন এবং এটি থেকে আপনি কিছু ধারণা নিতে পারেন কিনা তা পরীক্ষা করে দেখুন: http://docs.jboss.org/seam/latest/references/en-US/html_single/#d0e3620


2

জাভাস্ক্রিপ্টে, আমি কীভাবে অনন্যভাবে অন্য একটি ব্রাউজার উইন্ডোটি সনাক্ত করতে পারি যা একই কুকিযুক্ত বেসড অধিবেশন আইডির অধীনে থাকে

মূলত উইন্ডো.নাম ব্যবহার করুন। যদি এটি সেট না করা থাকে তবে এটি একটি অনন্য মানতে সেট করুন এবং এটি ব্যবহার করুন। এটি একই সেশনের অন্তর্ভুক্ত ট্যাবগুলিতে পৃথক হবে।


1

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


1

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

https://sites.google.com/site/sarittechworld/track-client-windows



1

দ্রষ্টব্য: সমাধানটি অ্যাপ্লিকেশন ডিজাইনের পর্যায়ে করা দরকার। এটি পরে ইঞ্জিনিয়ার করা কঠিন হবে।

সেশন শনাক্তকারীকে ঘিরে একটি লুকানো ক্ষেত্র ব্যবহার করুন

এটি কাজ করার জন্য প্রতিটি পৃষ্ঠায় একটি ফর্ম অন্তর্ভুক্ত থাকতে হবে:

<form method="post" action="/handler">

  <input type="hidden" name="sessionId" value="123456890123456890ABCDEF01" />
  <input type="hidden" name="action" value="" />

</form>

নেভিগেশন সহ আপনার প্রতিটি ক্রিয়া ফর্মটি পোস্ট করে ( actionযথাযথ হিসাবে সেট করে )। জন্য "অনিরাপদ" অনুরোধ, আপনি অন্য প্যারামিটার অন্তর্ভুক্ত করতে পারে, ধারণকারী ডেটার একটি JSON- মান জমা দিতে হবে বলে

<input type="hidden" name="action" value="completeCheckout" />
<input type="hidden" name="data" value='{ "cardNumber" : "4111111111111111", ... ' />

যেহেতু কোনও কুকিজ নেই, প্রতিটি ট্যাব স্বাধীন হবে এবং একই ব্রাউজারে অন্যান্য সেশনের কোনও জ্ঞান থাকবে না।

প্রচুর সুবিধাগুলি, বিশেষত এটি সুরক্ষার ক্ষেত্রে:

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

কিছু অসুবিধা:

  • পিছনে বোতাম কার্যকারিতা পছন্দসই হতে পারে।
  • প্রতিটি ক্রিয়া পোষ্ট হিসাবে ক্যাশে করা খুব কার্যকর নয়।

এখানে আরও তথ্য


1

আমি নিম্নলিখিত উপায়গুলির সমাধান করেছি:

  • আমি উইন্ডোতে একটি নাম নিযুক্ত করেছি এই নামটি সংযোগ সংস্থানটির একই।
  • সংযুক্ত সংযোগের জন্য কুকিতে সঞ্চিত প্লাস 1।
  • আমি সমস্ত এক্সএমএলআউটপুট প্রতিক্রিয়া ক্যাপচার জন্য একটি ফাংশন তৈরি করেছি এবং সিড এবং এসইসিকে নির্ধারণ করেছি এবং জসন ফর্ম্যাটে কুকি থেকে মুক্তি পাব। আমি প্রতিটি উইন্ডো.নামের জন্য এটি করি।

এখানে কোড:

var deferred = $q.defer(),
        self = this,
        onConnect = function(status){
          if (status === Strophe.Status.CONNECTING) {
            deferred.notify({status: 'connecting'});
          } else if (status === Strophe.Status.CONNFAIL) {
            self.connected = false;
            deferred.notify({status: 'fail'});
          } else if (status === Strophe.Status.DISCONNECTING) {
            deferred.notify({status: 'disconnecting'});
          } else if (status === Strophe.Status.DISCONNECTED) {
            self.connected = false;
            deferred.notify({status: 'disconnected'});
          } else if (status === Strophe.Status.CONNECTED) {
            self.connection.send($pres().tree());
            self.connected = true;
            deferred.resolve({status: 'connected'});
          } else if (status === Strophe.Status.ATTACHED) {
            deferred.resolve({status: 'attached'});
            self.connected = true;
          }
        },
        output = function(data){
          if (self.connected){
            var rid = $(data).attr('rid'),
                sid = $(data).attr('sid'),
                storage = {};

            if (localStorageService.cookie.get('day_bind')){
              storage = localStorageService.cookie.get('day_bind');
            }else{
              storage = {};
            }
            storage[$window.name] = sid + '-' + rid;
            localStorageService.cookie.set('day_bind', angular.toJson(storage));
          }
        };
    if ($window.name){
      var storage = localStorageService.cookie.get('day_bind'),
          value = storage[$window.name].split('-')
          sid = value[0],
          rid = value[1];
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.attach('bosh@' + BoshDomain + '/' + $window.name, sid, parseInt(rid, 10) + 1, onConnect);
    }else{
      $window.name = 'web_' + (new Date()).getTime();
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.connect('bosh@' + BoshDomain + '/' + $window.name, '123456', onConnect);
    }

আমি আপনাকে সাহায্য আশা করি


0

আমি এই পোস্টটি পড়ছি কারণ আমি ভেবেছিলাম আমি একই জিনিসটি করতে চাই। আমি যে অ্যাপ্লিকেশনটিতে কাজ করছি তার জন্য আমার একই অবস্থা। এবং সত্যই এটি ব্যবহারিকতার চেয়ে পরীক্ষার বিষয়।

এই উত্তরগুলি পড়ার পরে, বিশেষত মাইকেল বর্গওয়ার্টের দেওয়া একটি, আমি বুঝতে পেরেছি যে কাজের প্রবাহের বিদ্যমান থাকা দরকার:

  1. যদি ব্যবহারকারী লগইন স্ক্রিনে নেভিগেট করে তবে বিদ্যমান সেশনের জন্য পরীক্ষা করুন। যদি উপস্থিত থাকে তবে লগইন স্ক্রিনটিকে বাইপাস করে সেগুলি স্বাগত স্ক্রিনে প্রেরণ করুন।
  2. যদি ব্যবহারকারী (আমার ক্ষেত্রে) তালিকাভুক্তি স্ক্রিনে নেভিগেট করে তবে বিদ্যমান সেশনের জন্য পরীক্ষা করুন। যদি একটি বিদ্যমান থাকে তবে ব্যবহারকারীকে জানান যে আপনি সেই সেশনটি লগ আউট করতে চলেছেন। যদি তারা সম্মত হন, লগ আউট করুন এবং তালিকাভুক্তি শুরু করুন।

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

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

তবে এই পদ্ধতির কিছু গুরুতর সতর্কতা রয়েছে। যাঁর মধ্যে পরীক্ষার্থী যা পরীক্ষা করছেন তা হ'ল উত্পাদনে কী চলছে তা নয়

সুতরাং আমি মনে করি আমার বলতে হবে, এটি শেষ পর্যন্ত একটি খারাপ ধারণা।


0

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

http://www.javascriptkit.com/javatutors/domstorage.shtml

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage

আশাকরি এটা সাহায্য করবে.


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

0
How to differ sessions in browser-tabs?

ব্রাউজার ট্যাবগুলিতে সেশনগুলির পার্থক্য করার সবচেয়ে সোজা উপায় হ'ল কুকিজ সেট করার জন্য আপনার নির্দিষ্ট ডোমেনটিকে অস্বীকার করা। এইভাবে, আপনার পৃথক ট্যাবগুলি থেকে পৃথক সেশন থাকতে পারে। বলুন আপনি এই ডোমেনটি থেকে কুকিজ অস্বীকার করবেন: www.xyz.com। আপনি ট্যাব 1 খুলুন, লগইন করুন এবং ব্রাউজিং শুরু করুন। তারপরে আপনি ট্যাব 2 খুলুন এবং আপনি একই ব্যবহারকারী বা অন্য কোনও হিসাবে লগইন করতে পারেন; যেভাবেই হোক না কেন, আপনার ট্যাব 1 থেকে পৃথক একটি অধিবেশন থাকবে And ইত্যাদি।

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


0

আপনি করতে হবে

1- অ্যাকাউন্ট তালিকার জন্য একটি কুকি সঞ্চয় করুন

2- ডিফল্টর জন্য একটি কুকি storeচ্ছিক সঞ্চয় করুন

3- প্রতিটি অ্যাকাউন্টের জন্য এটি সূচিপত্রের মতো acc1, acc2 এর সাথে সঞ্চয় করুন

4- কিছু কিছু ইউআরএলতে অ্যাকাউন্টের সূচি উপস্থাপন করে এবং তা না হলে আপনি গুগল মেইল ​​ডোমেইন ডটকম / এসএমওআরএল এর মতো একটি ডিফল্ট নির্বাচন করবেন >> 0 এখানে অ্যাকাউন্টের সূচকে উপস্থাপনও করতে হবে আপনাকে কীভাবে জানতে হবে urlwrit ব্যবহার করুন

5- যখন কোনও কুকি নির্বাচন করবেন, আপনার urlpath অনুসারে অ্যাকাউন্ট সূচির প্রতিনিধিত্ব করুন select

শুভেচ্ছা সহ


0

আমি অনেকগুলি বাস্তবায়ন দেখতে পেয়েছি যার সেশন আইডি কুকিগুলি ম্যানিপুলেট করতে ক্লায়েন্টের পার্শ্ব পরিবর্তন রয়েছে। তবে সাধারণ সেশনে আইডি কুকিজটি এইচটিটিপি হতে হবে কেবল জাভা-স্ক্রিপ্ট অ্যাক্সেস করতে পারে না অন্যথায় এটি এক্সএসএসের মাধ্যমে সেশন হাইজ্যাকের দিকে নিয়ে যেতে পারে


0

যদি এটি হয় কারণ প্রতিটি ট্যাব আপনার অ্যাপ্লিকেশনটিতে পৃথক প্রবাহ চালাচ্ছে, এবং উভয় প্রবাহকে মিশ্রিত করায় সমস্যা দেখা দেয়, তবে আপনার সেশন অবজেক্টগুলিকে "আঞ্চলিককরণ" করা আরও ভাল, যাতে প্রতিটি প্রবাহ সেশনটির আলাদা অঞ্চল ব্যবহার করবে will

এই অঞ্চলটি প্রতিটি প্রবাহের জন্য আলাদা আলাদা উপসর্গ হিসাবে কার্যকর করা যেতে পারে, বা সেশন অবজেক্ট একাধিক মানচিত্র ধারণ করবে (প্রতিটি প্রবাহের জন্য একটি), এবং আপনি সেশন বৈশিষ্ট্যের পরিবর্তে এই মানচিত্রগুলি ব্যবহার করেন, তবে আপনার সেশন শ্রেণিটি প্রসারিত করা সর্বোত্তম would পরিবর্তে এটি ব্যবহার করুন।

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