Saya telah melihat beberapa pengembang mencari solusi untuk masalah ini: mengakses informasi sesi dari PERANG yang berbeda (bahkan ketika di dalam TELINGA yang sama) - berikut adalah beberapa contoh: Adakah cara untuk berbagi status sesi antara aplikasi yang berbeda di kucing jantan? , Sesi akses aplikasi web lain , file PERANG berbeda, sumber daya bersama , Tomcat: Bagaimana cara berbagi data antara dua aplikasi? , Apa yang dilakukan atribut crossContext di Tomcat? Apakah ini memungkinkan berbagi sesi? dan seterusnya...
Dari semua yang saya cari, ada beberapa solusi spesifik tergantung pada wadah, tetapi entah bagaimana ' bertentangan dengan spesifikasi '. Saya juga telah memeriksa spesifikasi Java EE tanpa hasil menemukan jawaban.
Beberapa pengembang berbicara tentang menggabungkan antara aplikasi web, tetapi saya cenderung tidak setuju. Apa alasan seseorang menyimpan WAR di dalam EAR yang sama jika tidak digabungkan? EJBs, misalnya, dapat diakses secara lokal (bahkan jika di dalam EJB JAR lain dalam EAR yang sama).
Lebih khusus lagi, salah satu PERANG saya menangani otentikasi dan otorisasi, dan saya ingin membagikan informasi ini dengan PERANG lainnya (di EAR yang sama). Saya telah berhasil mengatasi masalah yang sama sebelumnya dengan mengemas WARs sebagai JAR dan menempatkannya dalam proyek WAR tunggal (WEB-INF / lib). Namun saya tidak suka solusi ini (ini membutuhkan upaya besar pada penamaan servlet dan sebagainya).
Dan tidak ada solusi yang menjawab pertanyaan pertama (dan paling penting): Mengapa WAR tidak bisa berbagi informasi sesi?
sumber
Jawaban:
Perlakukan EAR seperti mesin pseudo-virtual
EAR hanyalah kumpulan file WAR yang berbagi konfigurasi dan pustaka umum, biasanya dari JAR. Ini memungkinkan koleksi layanan yang saling bergantung dikelola lebih mudah dalam wadah aplikasi. Dengan demikian Anda dapat menganggap EAR sebagai bentuk sederhana dari mesin virtual setelah dimasukkan ke dalam wadahnya.
Dengan cara yang sama bahwa satu proses pada mesin virtual tidak dapat mempengaruhi yang lain, hal yang sama berlaku untuk EAR. Semua PERANG terisolasi untuk melindungi keadaan internal mereka.
Otentikasi penskalaan
Secara umum aplikasi web harus stateless untuk skala dengan baik. Memiliki banyak informasi dalam sesi adalah anti-pola yang mencegah hal ini. Hal ini menyebabkan konflik antara sifat HTTP tanpa kewarganegaraan dan kebutuhan untuk mempertahankan pengalaman pengguna yang cepat dan dapat disesuaikan. Otentikasi adalah kasus penggunaan klasik, dan lazim di API cerewet yang membutuhkan banyak permintaan yang diautentikasi untuk memberikan fungsionalitas pengguna akhir.
Single Sign On dan Single Sign Off perlu pemberian sinyal secara hati-hati agar berfungsi dengan benar (pertimbangkan Sign Off sebagian), terutama ketika penskalaan horizontal dilakukan. Berbagi status sesi hampir tidak pernah merupakan solusi yang baik dan pendekatan yang lebih baik adalah dengan menggunakan satu titik referensi untuk informasi pengguna yang dapat diakses oleh semua node di cluster.
Berkonsentrasi pada akses cepat yang di-cache ke informasi yang relevan akan menghasilkan hasil yang jauh lebih terukur daripada solusi berbagi sesi yang kompleks dan rapuh.
sumber
Ini adalah sesuatu yang saya pikir tidak memiliki fungsionalitas dari spesifikasi JEE EAR - kemampuan untuk berbagi sesi web di beberapa arsip web yang terikat dalam EAR.
Server aplikasi seperti Weblogic memiliki implementasi non std untuk fungsi ini.
sumber
Nah, AFAIKS, tidak ada alasan nyata mengapa Anda ingin melakukan ini. PERANG adalah aplikasi web mandiri, dengan cakupannya sendiri (spesifik aplikasi web) (seperti cakupan sesi). Jika Anda perlu berbagi fungsionalitas (kode Java, halaman JSP, file CSS), di antara beberapa WAR, Anda memiliki opsi yang jauh lebih masuk akal untuk mengemasnya sebagai file JAR dan menempatkannya di server aplikasi Anda. Paket WAR adalah solusi pengemasan yang lebih kompleks, dan yang dirancang untuk merangkum sesuatu yang berbeda dari "kode / fungsi umum" yang sederhana. JAR adalah format yang lebih sederhana DAN dirancang untuk pengemasan dan berbagi kode dan fungsionalitas. Mengapa Anda ingin menggunakan kemasan yang lebih kompleks dan tidak khusus dirancang untuk itu untuk berbagi sesuatu, ketika Anda memiliki format paket yang lebih sederhana dan lebih cocok untuk itu yang sudah tersedia.
sumber
Saya pikir ini dilakukan dengan sengaja, untuk menghindari aplikasi web yang berbeda secara tidak sengaja menimpa informasi sesi satu sama lain. Mungkin berguna dalam kasus Anda, tetapi secara umum, Anda tidak ingin pengguna membuat aplikasi crash atau meningkatkan hak istimewa mereka hanya karena mereka menggunakan dua aplikasi web pada saat yang sama. Tidak terlalu sulit untuk berbagi informasi antara aplikasi web secara eksplisit; cukup buat kelas dengan HashMap statis, gunakan GUID sebagai kunci dan transfer sebagai bagian dari URL atau parameter HTTP.
sumber