Dalam aplikasi web yang diimplementasikan di java menggunakan JSP dan Servlets; jika saya menyimpan informasi di sesi pengguna, informasi ini dibagikan dari semua tab dari browser yang sama. Bagaimana cara membedakan sesi di tab browser? Dalam contoh ini:
<%@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>
Salin kode ini di halaman jsp ( testpage.jsp
), terapkan file ini dalam konteks aplikasi web yang ada di server (saya menggunakan Apache Tomcat), lalu buka browser (FF, IE7 atau Opera) menggunakan URL yang benar ( localhost/context1/testpage.jsp
), ketik nama Anda di input dan kirimkan formulir. Kemudian buka tab baru di browser yang sama, lalu Anda dapat melihat nama Anda (dapatkan dari sesi) di tab baru. Hati-hati dengan cache-browser, kadang-kadang sepertinya itu tidak terjadi, tetapi ada di cache, segarkan tab kedua.
Terima kasih.
Jawaban:
Anda dapat menggunakan HTML5 SessionStorage (window.sessionStorage). Anda akan membuat id acak dan menyimpannya di Penyimpanan sesi per Tab Browser. Kemudian setiap tab browser memiliki ID-nya sendiri.
sumber
Anda harus menyadari bahwa sesi sisi server adalah add-on buatan untuk HTTP. Karena HTTP tidak memiliki kewarganegaraan, server perlu mengenali bahwa suatu permintaan milik pengguna tertentu yang diketahuinya dan memiliki sesinya. Ada 2 cara untuk melakukan ini:
Apa yang kamu coba lakukan? Mengapa Anda ingin tab memiliki sesi terpisah? Mungkin ada cara untuk mencapai tujuan Anda tanpa menggunakan sesi sama sekali?
Edit: Untuk pengujian, solusi lain dapat ditemukan (seperti menjalankan beberapa instance browser pada VM terpisah). Jika satu pengguna perlu bertindak dalam peran yang berbeda pada waktu yang sama, maka konsep "peran" harus ditangani dalam aplikasi sehingga satu login dapat memiliki beberapa peran. Anda harus memutuskan apakah ini, menggunakan penulisan ulang URL, atau hanya hidup dengan situasi saat ini lebih dapat diterima, karena tidak mungkin untuk menangani tab browser secara terpisah dengan sesi berbasis cookie.
sumber
Properti Javascript window.name, adalah satu-satunya hal yang akan tetap ada di seluruh aktivitas tab, tetapi bisa tetap independen (bukan URL guff).
sumber
Seharusnya tidak. Jika Anda ingin melakukan hal seperti itu, Anda perlu memaksa pengguna untuk menggunakan satu contoh aplikasi Anda dengan menulis URL dengan cepat, gunakan sessionID yang sama (bukan sessionid itu tidak akan berfungsi) id dan meneruskannya di setiap URL.
Saya tidak tahu mengapa Anda membutuhkannya tetapi kecuali Anda perlu membuat aplikasi yang benar-benar tidak dapat digunakan, jangan lakukan itu.
sumber
Saya datang dengan solusi baru, yang memiliki sedikit overhead, tetapi tampaknya berfungsi sejauh prototipe. Asumsinya adalah bahwa Anda berada dalam lingkungan sistem terhormat untuk masuk, meskipun ini dapat diadaptasi dengan meminta ulang kata sandi setiap kali Anda berpindah tab.
Gunakan penyimpanan lokal (atau yang setara) dan peristiwa penyimpanan HTML5 untuk mendeteksi ketika tab browser baru telah mengalihkan pengguna mana yang aktif. Ketika itu terjadi, buat ghost overlay dengan pesan yang mengatakan Anda tidak dapat menggunakan jendela saat ini (atau nonaktifkan jendela untuk sementara waktu, Anda mungkin tidak ingin jendela menjadi begitu mencolok.) Saat jendela kembali fokus, kirim log permintaan AJAX pengguna kembali.
Satu peringatan untuk pendekatan ini: Anda tidak dapat memiliki panggilan AJAX normal (yaitu, panggilan yang bergantung pada sesi Anda) terjadi di jendela yang tidak memiliki fokus (misalnya jika Anda memiliki panggilan terjadi setelah penundaan), kecuali Anda secara manual membuat panggilan login ulang AJAX sebelum itu. Jadi sebenarnya yang perlu Anda lakukan adalah memeriksa fungsi AJAX Anda terlebih dahulu untuk memastikan localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id, dan jika tidak, login terlebih dahulu melalui AJAX.
Kondisi lainnya adalah balapan: jika Anda dapat beralih jendela cukup cepat untuk membingungkannya, Anda mungkin akan berakhir dengan urutan relogin1-> relogin2-> ajax1-> ajax2, dengan ajax1 dibuat di bawah sesi yang salah. Mengatasi ini dengan mendorong permintaan login AJAX ke dalam array, dan kemudian menyimpan dan sebelum mengeluarkan permintaan login baru, batalkan semua permintaan saat ini.
Gotcha terakhir yang harus diperhatikan adalah penyegaran jendela. Jika seseorang menyegarkan jendela saat Anda memiliki permintaan masuk AJAX aktif tetapi belum selesai, itu akan disegarkan atas nama orang yang salah. Dalam kasus ini, Anda dapat menggunakan acara beforeunload yang tidak standar untuk memperingatkan pengguna tentang potensi kekacauan dan meminta mereka untuk mengklik Batal, sementara itu menerbitkan kembali permintaan login AJAX. Maka satu-satunya cara mereka dapat merusaknya adalah dengan mengklik OK sebelum permintaan selesai (atau dengan tidak sengaja menekan enter / spacebar, karena OK - sayangnya untuk kasus ini - default.) Ada cara lain untuk menangani kasus ini, seperti mendeteksi penekanan F5 dan Ctrl + R / Alt + R, yang akan berfungsi dalam banyak kasus, tetapi dapat digagalkan oleh konfigurasi ulang pintasan keyboard pengguna atau penggunaan OS alternatif. Namun, ini adalah kasus yang sedikit rumit pada kenyataannya, dan skenario terburuk tidak pernah seburuk itu: dalam konfigurasi sistem kehormatan, Anda akan masuk sebagai orang yang salah (tetapi Anda dapat memperjelas bahwa hal ini terjadi dengan mempersonalisasi halaman dengan warna, gaya, nama yang ditampilkan secara mencolok, dll.); dalam konfigurasi kata sandi, tanggung jawab ada pada orang terakhir yang memasukkan kata sandi untuk keluar atau membagikan sesi mereka, atau jika orang ini sebenarnya adalah pengguna saat ini, maka tidak ada pelanggaran.
Tetapi pada akhirnya Anda memiliki aplikasi satu-pengguna-per-tab yang (mudah-mudahan) berfungsi sebagaimana mestinya, tanpa harus menyiapkan profil, menggunakan IE, atau menulis ulang URL. Pastikan Anda membuatnya jelas di setiap tab yang masuk ke tab tertentu itu, meskipun ...
sumber
Kami memiliki masalah ini dan kami menyelesaikannya dengan sangat mudah. Maksud saya mudah karena tidak ada pemrograman yang terlibat. Apa yang kami ingin lakukan adalah membiarkan pengguna masuk ke banyak akun dalam jendela browser yang sama tanpa bentrok sesi.
Jadi solusinya adalah subdomain acak.
23423.abc.com 242234.abc.com 235643.abc.com
Jadi kami meminta admin sistem kami untuk mengkonfigurasi sertifikat SSL untuk * .abc.com bukan abc.com. Kemudian dengan sedikit perubahan kode, setiap kali pengguna mencoba masuk, dia masuk ke tab dengan nomor subdomain acak. sehingga setiap tab dapat memiliki sesinya sendiri-sendiri. Juga untuk menghindari konflik, kami mengembangkan nomor acak menggunakan hash atau md5 id pengguna.
sumber
Saya akan jujur di sini. . . semua di atas mungkin atau mungkin tidak benar, tetapi semuanya tampak JAUH terlalu rumit, atau tidak membahas mengetahui tab apa yang sedang digunakan sisi server.
Terkadang kita perlu menggunakan pisau cukur Occam.
Inilah pendekatan Occam: (tidak, saya bukan Occam, dia meninggal pada 1347)
1) tetapkan ID unik browser ke halaman Anda saat dimuat. . . jika dan hanya jika jendela belum memiliki id (jadi gunakan awalan dan deteksi)
2) di setiap halaman yang Anda miliki (gunakan file global atau sesuatu) cukup letakkan kode di tempat untuk mendeteksi acara fokus dan / atau acara gerakan mouse. (Saya akan menggunakan jquery untuk bagian ini, untuk kemudahan penulisan kode)
3) dalam fungsi fokus (dan / atau gerakan mouse), tetapkan cookie dengan window.name di dalamnya
4) membaca nilai cookie dari sisi server Anda ketika Anda perlu membaca / menulis data khusus tab.
Sisi klien:
//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; }
sisi server (C # - untuk tujuan contoh)
//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];
Selesai.
sumber
Anda dapat menggunakan penulisan ulang tautan untuk menambahkan pengenal unik ke semua URL Anda saat memulai di satu halaman (misalnya index.html / jsp / apa saja). Browser akan menggunakan cookie yang sama untuk semua tab Anda sehingga semua yang Anda masukkan ke dalam cookie tidak akan unik.
sumber
Saya pikir apa yang mungkin Anda inginkan adalah mempertahankan status navigasi di seluruh tab dan tidak secara khusus membuat satu sesi per tab. Inilah yang dicapai kerangka kerja Seam dengan lingkup / konteks Percakapan mereka. Penerapannya bergantung pada fakta bahwa id percakapan disebarkan dengan setiap permintaan dan menciptakan gagasan percakapan di sisi server, yang merupakan sesuatu yang terletak di antara sesi dan permintaan. Ini memungkinkan untuk kontrol aliran navigasi dan manajemen negara.
Meskipun itu terutama ditujukan untuk JSF, lihat dan periksa apakah itu adalah sesuatu di mana Anda dapat mengambil beberapa ide dari: http://docs.jboss.org/seam/latest/reference/en-US/html_single/#d0e3620
sumber
Dalam javascript, bagaimana saya bisa secara unik mengidentifikasi satu jendela browser dari yang lain yang berada di bawah sessionId berbasis cookie yang sama
Pada dasarnya gunakan window.name. Jika tidak disetel, setel ke nilai unik dan gunakan. Ini akan berbeda di seluruh tab yang termasuk dalam sesi yang sama.
sumber
Pendekatan lain yang berhasil adalah membuat id jendela unik dan menyimpan nilai ini bersama dengan id sesi dalam tabel database. Id jendela yang sering saya gunakan adalah integer (sekarang). Nilai ini dibuat saat jendela dibuka dan dialihkan ke jendela yang sama jika jendela di-refresh, dimuat ulang, atau dikirim ke jendela itu sendiri. Nilai jendela (input) disimpan di tabel lokal menggunakan tautan. Ketika sebuah nilai diperlukan, itu diperoleh dari tabel database berdasarkan tautan id jendela / id sesi. Meskipun pendekatan ini membutuhkan database lokal, ini hampir sangat mudah. Penggunaan tabel database mudah bagi saya, tetapi saya tidak melihat alasan mengapa array lokal tidak berfungsi dengan baik.
sumber
Saya mengembangkan solusi untuk masalah ini baru-baru ini dengan menggunakan Cookies. Berikut ini tautan ke solusi saya. Saya juga menyertakan kode contoh solusi menggunakan ASP.NET, Anda harus dapat menyesuaikannya dengan JSP atau Servelets jika Anda membutuhkannya.
https://sites.google.com/site/sarittechworld/track-client-windows
sumber
Sesi Musim Semi mendukung banyak sesi dalam peramban yang sama. Lihat contoh dan detail penerapan http://docs.spring.io/spring-session/docs/current/reference/html5/guides/users.html
sumber
Catatan: Solusi di sini perlu dilakukan pada tahap desain aplikasi. Akan sulit untuk merekayasa ini nanti.
Gunakan bidang tersembunyi untuk menyebarkan pengenal sesi .
Agar ini berfungsi, setiap halaman harus menyertakan formulir:
<form method="post" action="/handler"> <input type="hidden" name="sessionId" value="123456890123456890ABCDEF01" /> <input type="hidden" name="action" value="" /> </form>
Setiap tindakan di sisi Anda, termasuk navigasi, POST formulir kembali (pengaturan yang
action
sesuai). Untuk permintaan "tidak aman" , Anda dapat menyertakan parameter lain, misalnya berisi nilai JSON dari data yang akan dikirim:<input type="hidden" name="action" value="completeCheckout" /> <input type="hidden" name="data" value='{ "cardNumber" : "4111111111111111", ... ' />
Karena tidak ada cookie, setiap tab akan independen dan tidak memiliki pengetahuan tentang sesi lain di browser yang sama.
Banyak keuntungan, terutama jika menyangkut keamanan:
Beberapa kelemahan:
Informasi lebih lanjut disini .
sumber
Saya menyelesaikan ini dengan cara berikut:
disini kodenya:
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); }
Saya harap membantu Anda
sumber
Saya telah membaca posting ini karena saya pikir saya ingin melakukan hal yang sama. Saya memiliki situasi serupa untuk aplikasi yang sedang saya kerjakan. Dan sebenarnya ini masalah pengujian lebih dari kepraktisan.
Setelah membaca jawaban ini, terutama yang diberikan oleh Michael Borgwardt, saya menyadari alur kerja yang perlu ada:
Ini akan memecahkan masalah pengguna melihat data "pengguna lain" di sesi mereka. Mereka tidak benar-benar melihat data "pengguna lain" di sesi mereka, mereka benar-benar melihat data dari satu-satunya sesi yang mereka buka. Jelas ini menyebabkan beberapa data menarik karena beberapa operasi menimpa beberapa data sesi dan bukan yang lain sehingga Anda memiliki kombinasi data dalam satu sesi tersebut.
Sekarang, untuk mengatasi masalah pengujian. Satu-satunya pendekatan yang layak adalah memanfaatkan Petunjuk Preprocessor untuk menentukan apakah sesi tanpa cookie harus digunakan. Lihat, dengan membangun konfigurasi khusus untuk lingkungan tertentu, saya dapat membuat beberapa asumsi tentang lingkungan dan untuk apa lingkungan itu digunakan. Ini akan memungkinkan saya untuk secara teknis memiliki dua pengguna yang masuk pada saat yang sama dan penguji dapat menguji beberapa skenario dari sesi browser yang sama tanpa pernah keluar dari salah satu sesi server tersebut.
Namun, pendekatan ini memiliki beberapa peringatan serius. Paling tidak adalah fakta bahwa apa yang diuji oleh penguji bukanlah apa yang akan berjalan dalam produksi.
Jadi saya pikir saya harus mengatakan, ini pada akhirnya adalah ide yang buruk.
sumber
Menyimpan timeStamp di window.sessionStorage jika belum disetel. Ini akan memberikan nilai unik untuk setiap tab (meskipun URL-nya sama)
http://www.javascriptkit.com/javatutors/domstorage.shtml
https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage
Semoga ini membantu.
sumber
How to differ sessions in browser-tabs?
Cara paling mudah untuk membedakan sesi di tab browser adalah dengan melarang domain tertentu Anda menyetel cookie. Dengan begitu, Anda dapat memiliki sesi terpisah dari tab terpisah. Misalnya Anda melarang cookie dari domain ini: www.xyz.com. Anda membuka Tab 1, masuk dan mulai menjelajah. Kemudian Anda membuka Tab 2, dan Anda dapat masuk sebagai pengguna yang sama atau pengguna berbeda; bagaimanapun juga, Anda akan memiliki sesi yang terpisah dari Tab 1. Dan seterusnya.
Tetapi tentu saja hal ini dimungkinkan bila Anda memiliki kendali atas sisi klien. Jika tidak, solusi yang ditentukan oleh orang-orang di sini harus diterapkan.
sumber
Anda perlu melakukannya
1- Simpan cookie untuk daftar akun
2- opsional menyimpan cookie sebagai default
3- simpan untuk setiap akun dengan indeksnya seperti acc1, acc2
4- taruh di url sesuatu yang mewakili indeks akun dan jika tidak Anda akan memilih yang default seperti google mail domain.com/0/some-url >> 0 di sini mewakili indeks akun juga Anda mungkin perlu tahu caranya gunakan urlwrite
5- ketika memilih cookie, pilih sesuai dengan urlpath Anda mewakili indeks akun
Salam
sumber
Saya melihat banyak implementasi yang memiliki perubahan sisi klien untuk memanipulasi cookie id sesi. Tetapi dalam sesi umum cookie id harus HttpOnly sehingga java-script tidak dapat mengakses jika tidak maka dapat menyebabkan Session Hijack melalui XSS
sumber
Jika itu karena setiap tab akan menjalankan aliran yang berbeda dalam aplikasi Anda, dan mencampurkan kedua aliran menyebabkan masalah, maka lebih baik untuk "Regionalisasi" objek sesi Anda, sehingga setiap aliran akan menggunakan wilayah sesi yang berbeda
Wilayah ini dapat diimplementasikan sesederhana memiliki prefiks yang berbeda untuk setiap aliran, atau objek sesi akan menyimpan beberapa peta (satu untuk setiap aliran), dan Anda menggunakan peta tersebut sebagai ganti atribut sesi, yang terbaik adalah memperluas kelas sesi Anda dan gunakan saja.
sumber