Hangi koşullar altında bir JSESSIONID oluşturulur?


276

A'nın ne zaman oluşturulduğu / koşulları JSESSIONIDnelerdir?

Alan adı başına mı? Örneğin, bir Tomcat uygulama sunucum varsa ve birden fazla web uygulaması dağıtıyorsam, JSESSIONIDiçerik başına farklı bir oluşturulur (web uygulaması) veya aynı etki alanı oldukları sürece web uygulamaları arasında paylaşılıyor mu?

Yanıtlar:


324

Oturum oluşturulduğunda JSESSIONID çerezi oluşturulur / gönderilir. Oturum, kodunuz çağrıldığında request.getSession()veya request.getSession(true)ilk kez oluşturulur. Oturumu almak istiyorsanız, ancak oturumu oluşturmazsanız, kullanın request.getSession(false)- bu size bir oturum döndürür veya null. Bu durumda, yeni oturum oluşturulmaz ve JSESSIONID çerezi gönderilmez. (Bu ayrıca demektir mutlaka ilk istek üzerine oluşturulmadı oturumu ... sizi ve kod kontrolünde olan oturumun oluşturulur)

Oturumlar bağlama göre yapılır:

SRV.7.3 Oturum Kapsamı

HttpSession nesneleri uygulama (veya sunucu uygulaması bağlamı) düzeyinde kapsamlandırılmalıdır. Oturumu oluşturmak için kullanılan çerez gibi temel mekanizma, farklı bağlamlar için aynı olabilir, ancak söz konusu nesnedeki öznitelikler de dahil olmak üzere başvurulan nesne, kap tarafından bağlamlar arasında paylaşılmamalıdır.

( Servlet 2.4 özellikleri )

Güncelleme: JSP sayfasına yapılan her çağrı, henüz oturum yoksa örtük olarak yeni bir oturum oluşturur. Bu session='false'sayfa yönergesiyle kapatılabilir , bu durumda oturum değişkeni JSP sayfasında hiç bulunmaz.


2
getSession için açık bir çağrı olmadan bir oturum oluşturulamıyor mu? "konteyner tarafından bağlamlar arasında asla paylaşılmamalıdır" ile ilgili olarak, websphere oturumları paylaşmak için bir seçenek vardır, bu soru için motivasyon :)
joshjdevl

Yalnızca Servlet API'sı kullanıyorsanız değil. Yine de sunucuya özgü uzantılar (işaret ettiğinizde Websphere'in oturum paylaşımı gibi) olabilir.
Peter Štibranı

<Context> etiketiniz bir çerez özniteliği içeriyorsa, context.xml dosyanızın otomatik oturum oluşturmayı kontrol edebileceğine inanıyorum; örneğin, <Context cookies = "false">
BT

Şu anda oturum oluşturmak için filtremde birçok isabet alıyorum ve sadece ikinci isabetten sonra (ikinci bir sayfa yenilemesi değil) yaratıldığı gibi görünüyor, bu benim dikkatim "oturum mutlaka ilk istek üzerine oluşturulmuyor .." ilgili mi? bunun ilk istekte neden zorunlu olarak oluşturulmadığına bir örnek verebilir misiniz? Teşekkürler!
jpganz18

@ jpganz18: Sadece request.getSession()veya öğesini ararsanız request.getSession(true), varolan veya yeni oturumu alırsınız. Ancak kodunuz ararsa request.getSession(false), varolan oturumu veya oturum yoksa null değerini alırsınız.
Peter Štibranı

49

JSESSIONIDÇerezin bir kaynağı daha hakkında bazı bilgiler :

Tomcat sunucusunda çalışan bazı Java kodlarında hata ayıklama yapıyordum. request.getSession()Kodumun herhangi bir yerinde açıkça aramıyordum ama bir JSESSIONIDçerezin hala ayarlandığını fark ettim .

Sonunda Tomcat altındaki çalışma dizinindeki bir JSP'ye karşılık gelen oluşturulan Java koduna bir göz attım.

Hoşunuza gitsin ya da gitmesin, bir sunucu uygulamasından bir JSP çağırırsan, JSESSIONIDyaratılacak!

Eklendi: Ben sadece aşağıdaki JSP yönergesini ekleyerek buldum:

<%@ page session="false" %>

ayarını JSESSIONIDbir JSP ile devre dışı bırakabilirsiniz .


3
Başka bir deyişle: sayfa oturumu özelliğinin varsayılan değeri "true" dur. Bazı (birçok?) Durumlarda hangisi beklenmedik olabilir.
David Balažic

Ben de tomcat'dayım ve jsp kullanmıyorum ama yine de oturum çerezi yaratılıyor. Bu durumda nasıl önleneceği hakkında bir fikrin var mı?
ClassyPimp

23

DÜZELTME: Lütfen Peter Štibraný'nın cevabına oy verin - daha doğru ve eksiksiz!

Bir "JSESSIONID", http oturumunun benzersiz kimliğidir - bkz. Javadoc . Orada, aşağıdaki cümleyi bulacaksınız

Oturum bilgileri yalnızca geçerli web uygulamasına (ServletContext) dahil edilir, bu nedenle bir bağlamda depolanan bilgiler başka bir bağlamda doğrudan görünmez.

Bir siteye ilk kez bastığınızda, yeni bir oturum oluşturulur ve SevletContext'e bağlanır. Birden fazla uygulama dağıtırsanız, oturum paylaşılmaz.

Ayrıca geçerli oturumu geçersiz kılabilir ve böylece yeni bir oturum oluşturabilirsiniz. Örneğin, http'den https'ye (giriş yaptıktan sonra) geçiş yaparken, yeni bir oturum oluşturmak çok iyi bir fikirdir.

Umarım bu sorunuzu cevaplar.


1
Oturum kapsamının net açıklaması.
user3123690

@Bağlantı koptu
Timofey

8

Sayfanızda başka .jsp veya .jspf (fragman) varsa dikkatli olun! Eğer ayarlamazsan

<%@ page session="false" %>

üst sayfa da yeni bir oturum başlatır ve JSESSIONID çerezini ayarlar.

Özellikle .jspf sayfaları için, web.xml dosyanızı böyle bir pasajla yapılandırdıysanız bu gerçekleşir:

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

İçlerindeki komut dosyalarını etkinleştirmek için.


Tüm sayfalarda (.jsp ve .jspf) set session session = false ifadesini mi yoksa parçacıkların geri kalanını içeren ana jsp'ye eklemediğiniz anlamına mı geliyor?
Ommadawn

2

JSP'de özel etiketlerle oluşturulan bağlantılar için şunu kullanmak zorundaydım:

<%@ page session="false" %>

JSP'de

VE

request.getSession().invalidate();

Struts eyleminde

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.