Mengapa WARs tidak bisa berbagi info sesi?

11

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?

rvcoutinho
sumber
1
Tidak yakin mengapa ini dibatalkan, selain itu mungkin lebih cocok untuk SO.
NateDSaint
3
"Sesuai dengan spesifikasi API servlet 2.3, manajer sesi mendukung pelingkupan sesi dengan modul Web saja. Hanya servlet dalam modul Web yang sama yang dapat mengakses data yang terkait dengan sesi tertentu." Ini dapat dilihat lagi di HttpSession - "Informasi sesi hanya mencakup aplikasi web saat ini (ServletContext), sehingga informasi yang disimpan dalam satu konteks tidak akan langsung terlihat di yang lain." - Melakukan hal itu bertentangan dengan spesifikasi.
(lebih baik, tautan saat ini untuk HttpSession )
@MichaelT, terima kasih. Tapi tetap saja tidak menjawab mengapa.
rvcoutinho
@NateDSaint Meskipun pertanyaannya terkait dengan teknologi tertentu, saya percaya itu lebih cenderung menjadi pertanyaan konseptual. Kemudian, saya memutuskan untuk Programmer.
rvcoutinho

Jawaban:

7

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.

Gary Rowe
sumber
Terima kasih, @GaryRowe. Ini jawaban yang saya cari. Lagi pula, tidak bisakah itu bagi pengembang untuk memutuskan?
rvcoutinho
Pertanyaan lain: Apakah Anda pikir JBoss Cache mungkin menjadi solusi yang baik? Pernahkah Anda mendengar tentang Apache Shiro (dan pengelompokan sesi)? Bagaimana dengan itu?
rvcoutinho
@rvcoutinho Apakah pengembang aplikasi memutuskan bagaimana proses dikelola dalam kernel Linux? Itu adalah kerangka yang sama dari sebuah pertanyaan - ya, Anda bisa melakukannya tetapi itu akan sangat sulit dan mungkin menyebabkan Anda lebih sakit daripada mengambil jalan alternatif.
Gary Rowe
2
@rvcoutinho Saya belum pernah menggunakan Apache Shiro (alias Apache Security) tapi saya membayangkan itu akan menjadi solusi yang baik untuk masalah keamanan bersama. Pertimbangkan untuk berintegrasi dengan OpenID dan OAuth2 daripada menggulung protokol Anda sendiri untuk mencapai hal yang sama. JBoss Cache adalah dengan pengakuan mereka sendiri di jalan buntu digantikan dengan Infinispan yang terlihat agak rumit. Anda mungkin ingin melihat situs App Twelve-Factor untuk melihat sekilas solusi sederhana yang lebih terukur.
Gary Rowe
2

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.

Martijn Verburg
sumber
Itu pendapat saya sejauh ini. Saya berusaha memahami mengapa pilihan tersebut dibuat.
rvcoutinho
1

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.

Shivan Dragon
sumber
Saya setuju dengan kamu. Tetapi hanya ketika datang ke sumber daya umum. Tetapi, untuk aplikasi masuk tunggal, saya perlu berbagi informasi khusus sesi (tentang pengguna yang dicatat). Dan saya tidak melihat alasan mengapa ini akan bertentangan dengan spec.
rvcoutinho
2
Karena ruang lingkup sesi tidak dibuat untuk berbagi data pengguna saat ini antara berbagai aplikasi. Dan karena SSO menyiratkan lebih dari memeriksa atribut cakupan sesi. Anda dapat membuat dan mengemas kode di luar perang Anda (dan yang tidak akan bergantung pada perang Anda, tetapi sebaliknya bergantung pada perang) yang akan mengakses atribut lingkup sesi jika Anda menginginkannya (seperti filter), tetapi solusi IMHO yang lebih baik adalah untuk memiliki aplikasi fasad terpisah atau konfigurasi server yang berkaitan dengan auth, dan memberikan akses ke aplikasi lain (yang disebarkan perang).
Shivan Dragon
Saya akan kembali setuju dengan Anda. Namun spesifikasi JavaEE (menggunakan JAAS) menyimpan informasi pengguna sebagai bagian dari HttpSession, yang bertentangan dengan pendekatan ini. Salah satu alasan saya mempertimbangkan untuk menggunakan Shiro (ini mempertahankan sesi ortogonal) sebagai gantinya.
rvcoutinho
Bagaimanapun, terima kasih atas tanggapannya. Saya masih belum memiliki jawaban pasti untuk pertanyaan saya, tetapi semua yang Anda katakan relevan. +1
rvcoutinho
@rvcoutinho yah, itu pendapat saya tentang masalah ini, maaf itu tidak lebih membantu Anda.
Shivan Dragon
0

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.

pengguna281377
sumber
Terima kasih. Sebenarnya, saya tidak berbicara tentang berbagi seluruh sesi antara setiap aplikasi, tetapi informasi sesi khusus (seperti info pengguna) saat diperlukan. Mungkin saya tidak jelas. Adakah saran untuk membuatnya lebih jelas?
rvcoutinho