ServletContext'te
Sunucu uygulaması kapsayıcısı ( Apache Tomcat gibi ) başladığında, tüm web uygulamalarını dağıtır ve yükler. Bir web uygulaması yüklendiğinde sunucu uygulaması kapsayıcısı bir ServletContext
kez oluşturur ve sunucunun belleğinde tutar. Web uygulaması en web.xml
ve dahil tüm web-fragment.xml
dosyaların çözümlenen ve her edilir <servlet>
, <filter>
ve <listener>
bulunan (veya her sınıf ile açıklamalı @WebServlet
, @WebFilter
ve @WebListener
sırasıyla) bir kez örneği ve sunucunun bellekte tutulur yanı edilir. Her somutlaştırılmış filtre için init()
yöntemi yeni bir yöntemle çağrılır FilterConfig
.
Bir zaman Servlet
bir sahiptir <servlet><load-on-startup>
ya da @WebServlet(loadOnStartup)
daha değeri daha büyük 0
, daha sonra init()
yöntem, aynı zamanda, yeni bir başlatma sırasında çağrılır ServletConfig
. Bu sunucu uygulamaları (o değere göre belirtilen sırayla başlatılır 1
1 olduğu, 2
2nd, vb). Aynı değeri birden fazla sunucu uygulaması belirtilirse bu görünür şekilde, o zaman bu servlet her biri aynı sırayla yüklenir web.xml
, web-fragment.xml
ya da @WebServlet
classloading. "Başlangıçta yükleme" değeri yoksa, init()
HTTP isteği bu sunucu uygulamasına ilk kez ulaştığında yöntem çağrılır.
Sunucu uygulaması kabı yukarıda açıklanan başlatma adımlarının tümü ile bittiğinde, servis ServletContextListener#contextInitialized()
çağrılır.
Aşağı sunucu uygulaması kap kapanır, tüm internet uygulamaları kaldırır, çağırır destroy()
onun başlatıldı servlet ve filtreler, ve tüm yöntemi ServletContext
, Servlet
, Filter
ve Listener
örnekler çöpe atılan. Sonunda ServletContextListener#contextDestroyed()
çağrılacak.
HttpServletRequest ve HttpServletResponse
Sunucu uygulaması kapsayıcısı, belirli bir bağlantı noktası numarasındaki HTTP isteklerini dinleyen bir web sunucusuna eklenir (bağlantı noktası 8080 genellikle geliştirme sırasında ve bağlantı noktası üretim sırasında 80 kullanılır). Bir istemci (örneğin, bir web tarayıcısı olan veya programlı olarak kullanan bir kullanıcıURLConnection
) bir HTTP isteği gönderdiğinde, sunucu uygulaması kapsayıcısı yeni oluşturur HttpServletRequest
ve HttpServletResponse
nesneler oluşturur ve bunları Filter
zincirde ve nihayetinde Servlet
örnekte tanımlananlardan geçirir .
Filtre durumunda , doFilter()
yöntem çağrılır. Sunucu uygulaması kabının kodu aradığında chain.doFilter(request, response)
, istek ve yanıt bir sonraki filtreye devam eder veya kalan filtre yoksa sunucu uygulamasına vurur.
Sunucu uygulamaları durumunda , service()
yöntem çağrılır. Varsayılan olarak, bu yöntem hangi doXxx()
yöntemlerden hangisinin kullanılacağını belirler request.getMethod()
. Belirlenen yöntem sunucu uygulamasında yoksa, yanıtta bir HTTP 405 hatası döndürülür.
İstek nesnesi, URL isteği, üstbilgileri, sorgu dizesi ve gövdesi gibi HTTP isteğiyle ilgili tüm bilgilere erişim sağlar. Yanıt nesnesi, HTTP yanıtını istediğiniz şekilde kontrol etme ve gönderme olanağı sağlar; örneğin, üstbilgileri ve gövdeyi (genellikle bir JSP dosyasından oluşturulan HTML içeriğiyle) ayarlamanıza olanak tanır. HTTP yanıtı tamamlandığında ve bittiğinde, hem istek hem de yanıt nesneleri geri dönüştürülür ve yeniden kullanılabilir hale getirilir.
HttpSession
Bir istemci web uygulamasını ilk kez ziyaret ettiğinde ve / veya HttpSession
aracılığıyla ilk kez request.getSession()
alındığında, sunucu uygulaması kapsayıcısı yeni bir HttpSession
nesne oluşturur, uzun ve benzersiz bir kimlik oluşturur (bunu elde edebilirsiniz session.getId()
) ve bunu sunucuda depolar. hafıza. Sunucu uygulaması bir konteynır setleri Cookie
de Set-Cookie
HTTP yanıtı başlığında JSESSIONID
adını ve değer olarak benzersiz bir oturum numarası olarak.
Gereğince HTTP çerezi şartnamede (sözleşme uymalıdır herhangi nezih bir web tarayıcı ve web sunucusu), istemci (web tarayıcısı) 'de daha sonraki isteklerinin bu çerez geri göndermek için gerekli olan Cookie
uzun çerez geçerli olduğu kadar için başlığındaki ( başka bir deyişle, benzersiz kimlik süresi dolmamış bir oturuma başvurmalıdır ve alan ve yol doğru olmalıdır). Tarayıcınızın yerleşik HTTP trafik izleyicisini kullanarak, çerezin geçerli olduğunu doğrulayabilirsiniz (Chrome / Firefox 23+ / IE9 + 'da F12 tuşuna basın ve Net / Ağ sekmesini kontrol edin ). Sunucu uygulaması kapsayıcısı, Cookie
gelen her HTTP isteğinin başlığını, adıyla birlikte çerezin olup olmadığını kontrol eder JSESSIONID
ve HttpSession
sunucunun belleğinden ilişkilendirmek için değerini (oturum kimliği) kullanır .
HttpSession
Bunun kadar hayatta kalır fazlasında belirtilen zaman aşımı değerinden daha için (yani bir istek kullanılmaz) boşta <session-timeout>
bir ayar web.xml
. Zaman aşımı değeri varsayılan olarak 30 dakikadır. Bu nedenle, istemci web uygulamasını belirtilen süreden daha uzun süre ziyaret etmediğinde, sunucu uygulaması kapsayıcısı oturumu çöp kutusuna atar. Takip eden her istek, tanımlama bilgisi belirtilmiş olsa bile, artık aynı oturuma erişemeyecektir; sunucu uygulaması kapsayıcısı yeni bir oturum oluşturur.
İstemci tarafında, oturum çerezi tarayıcı örneği çalıştığı sürece canlı kalır. Bu nedenle, istemci tarayıcı örneğini kapatırsa (tüm sekmeler / pencereler), oturum istemci tarafında çöpe atılır. Yeni bir tarayıcı örneğinde, oturumla ilişkilendirilmiş çerez mevcut olmaz, bu yüzden artık gönderilmez. Bu HttpSession
, tamamen yeni bir oturum çerezi kullanılarak tamamen yeni bir yaratılmasına neden olur .
Kısaca
ServletContext
Sürece web uygulaması hayatları olduğunca yaşıyor. Tüm oturumlardaki tüm istekler arasında paylaşılır .
HttpSession
Uzun istemci aynı tarayıcı örneği ile web uygulaması ile etkileşim ve oturum sunucu tarafında aşımına henüz olduğunca için yaşıyor. Aynı oturumdaki tüm istekler arasında paylaşılır .
HttpServletRequest
Ve HttpServletResponse
servlet istemciden bir HTTP isteği alır zaman canlı, tam cevap (web sayfası) gelinceye kadar. O edilir değil başka yerde paylaştı.
- Tüm
Servlet
, Filter
ve Listener
örnekleri sürece web uygulaması yaşadıkça yaşar. Tüm oturumlardaki tüm talepler arasında paylaşılırlar .
- Herhangi
attribute
tanımlanmış olduğunu ServletContext
, HttpServletRequest
ve HttpSession
soru hayatımızda nesne sürece yaşayacaktır. Nesnenin kendisi JSF, CDI, Bahar, vb. Gibi fasulye yönetim çerçevelerindeki "kapsamı" temsil eder. Bu çerçeveler attribute
kapsam dahilindeki çekirdeklerini en yakın eşleşen kapsamı olarak depolar .
İplik Güvenliği
Bununla birlikte, büyük endişeniz muhtemelen iplik güvenliği . Artık sunucu uygulamaları ve filtrelerin tüm istekler arasında paylaşıldığını bilmelisiniz. Java ile ilgili güzel bir şey, çok iş parçacıklı ve farklı iş parçacıkları (okuma: HTTP istekleri) aynı örneği kullanabilir. Aksi halde yeniden oluşturmak çok pahalı olurdu init()
ve destroy()
her istek için onları.
Ayrıca, herhangi bir istek veya oturum kapsamındaki verileri asla bir sunucu uygulamasının veya filtrenin örnek değişkeni olarak atamamanız gerektiğini de bilmelisiniz . Diğer oturumlardaki diğer tüm talepler arasında paylaşılacaktır. Bu güvenli değil ! Aşağıdaki örnek bunu göstermektedir:
public class ExampleServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Ayrıca bakınız: