Dalam kondisi apa JSESSIONID dibuat?

276

Kapan / apa saja kondisi saat a JSESSIONIDdibuat?

Apakah per domain? Misalnya, jika saya memiliki server aplikasi Tomcat, dan saya menggunakan beberapa aplikasi web, akankah yang berbeda JSESSIONIDdibuat per konteks (aplikasi web), atau apakah itu dibagikan di seluruh aplikasi web selama mereka adalah domain yang sama?

joshjdevl
sumber

Jawaban:

324

Cookie JSESSIONID dibuat / dikirim ketika sesi dibuat. Sesi dibuat ketika kode Anda memanggil request.getSession()atau request.getSession(true)untuk pertama kalinya. Jika Anda hanya ingin mendapatkan sesi, tetapi tidak membuatnya jika tidak ada, gunakan request.getSession(false)- ini akan mengembalikan Anda satu sesi atau null. Dalam hal ini, sesi baru tidak dibuat, dan cookie JSESSIONID tidak dikirim. (Ini juga berarti bahwa sesi tidak harus dibuat atas permintaan pertama ... Anda dan kode Anda memegang kendali saat sesi dibuat)

Sesi adalah per konteks:

SRV.7.3 Lingkup Sesi

Objek HttpSession harus dicakup pada level aplikasi (atau konteks servlet). Mekanisme yang mendasarinya, seperti cookie yang digunakan untuk membangun sesi, bisa sama untuk konteks yang berbeda, tetapi objek yang dirujuk, termasuk atribut dalam objek itu, tidak boleh dibagi di antara konteks oleh wadah.

( Spesifikasi Servlet 2.4 )

Pembaruan: Setiap panggilan ke halaman JSP secara implisit membuat sesi baru jika belum ada sesi. Ini dapat dimatikan dengan session='false'arahan halaman, di mana variabel sesi kasus tidak tersedia di halaman JSP sama sekali.

Peter Štibraný
sumber
2
tidak bisakah sesi dibuat tanpa panggilan eksplisit untuk getSession? dalam hal "harus tidak pernah dibagi antara konteks oleh wadah", WebSphere memiliki opsi untuk sesi berbagi, yang merupakan motivasi untuk pertanyaan :)
joshjdevl
Tidak jika Anda hanya menggunakan Servlet API. Mungkin ada ekstensi khusus server (seperti sesi berbagi Websphere saat Anda tunjukkan).
Peter Štibraný
Saya yakin file context.xml Anda dapat mengontrol pembuatan sesi otomatis jika tag <Context> Anda berisi atribut cookie, mis. <Context cookies = "false">
BT
Saat ini saya mendapatkan banyak klik pada filter saya untuk membuat sesi dan sepertinya baru setelah hit kedua (bukan refresh halaman kedua) yang sedang dibuat, ini disebut perhatian saya "sesi tidak harus dibuat berdasarkan permintaan pertama .." adalah itu terkait? dapatkah Anda memberi contoh mengapa ini tidak harus dibuat atas permintaan pertama? Terima kasih!
jpganz18
@ jpganz18: Jika Anda hanya menelepon request.getSession()atau request.getSession(true), maka Anda mendapatkan sesi yang ada atau baru. Namun jika kode Anda panggilan request.getSession(false), maka Anda mendapatkan sesi yang ada atau nol, jika tidak ada sesi.
Peter Štibraný
49

Berikut ini beberapa informasi tentang satu lagi sumber JSESSIONIDcookie:

Saya hanya men-debug beberapa kode Java yang berjalan pada server kucing jantan. Saya tidak menelepon request.getSession()secara eksplisit di mana pun dalam kode saya, tetapi saya perhatikan bahwa JSESSIONIDcookie masih diatur.

Saya akhirnya melihat kode Java yang dihasilkan sesuai dengan JSP di direktori kerja di bawah Tomcat.

Tampaknya, suka atau tidak, jika Anda memohon JSP dari servlet, JSESSIONIDakan dibuat!

Ditambahkan: Saya baru saja menemukan bahwa dengan menambahkan arahan JSP berikut:

<%@ page session="false" %>

Anda dapat menonaktifkan pengaturan JSESSIONIDoleh JSP.

Rangachari Anand
sumber
3
Dengan kata lain: nilai default untuk atribut sesi halaman adalah "benar". Yang mungkin tidak terduga dalam beberapa (banyak?) Kasus.
David Balažic
Saya juga menggunakan kucing jantan, dan saya tidak menggunakan jsp sama sekali, tetapi cookie sesi tetap dibuat. Adakah yang tahu bagaimana mencegahnya dalam situasi ini?
ClassyPimp
23

KOREKSI: Silakan pilih jawaban Peter Štibraný - lebih tepat dan lengkap!

"JSESSIONID" adalah id unik dari sesi http - lihat javadoc di sini . Di sana, Anda akan menemukan kalimat berikut

Informasi sesi hanya mencakup aplikasi web saat ini (ServletContext), sehingga informasi yang disimpan dalam satu konteks tidak akan langsung terlihat di yang lain.

Jadi, ketika Anda pertama kali menekan situs, sesi baru dibuat dan terikat ke SevletContext. Jika Anda menggunakan beberapa aplikasi, sesi tidak dibagikan.

Anda juga dapat membatalkan sesi saat ini dan karenanya membuat yang baru. misalnya ketika beralih dari http ke https (setelah login), itu adalah ide yang sangat bagus, untuk membuat sesi baru.

Semoga ini menjawab pertanyaan Anda.

Mo.
sumber
1
Penjelasan yang jelas tentang ruang lingkup sesi.
user3123690
@Apakah tautannya rusak
Timofey
8

Waspadalah jika halaman Anda termasuk .jsp atau .jspf (fragmen) lainnya! Jika Anda tidak mengatur

<%@ page session="false" %>

pada mereka juga, halaman induk akan berakhir dengan memulai sesi baru dan mengatur cookie JSESSIONID.

Untuk halaman .jspf pada khususnya, ini terjadi jika Anda mengkonfigurasi web.xml Anda dengan cuplikan seperti itu:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

untuk mengaktifkan skrip di dalamnya.

polaretto
sumber
Apakah yang Anda maksud set page session = false di semua fragmen yang disertakan (.jsp dan .jspf) dan tidak termasuk dalam jsp utama yang menyertakan sisa cuplikan?
Ommadawn
2

Untuk tautan yang dibuat di JSP dengan tag khusus, saya harus menggunakannya

<%@ page session="false" %>

di JSP

DAN

request.getSession().invalidate();

dalam aksi Struts

Jerome Jaglale
sumber