Sunucu uygulamalarını nasıl çalışır? Örnekleme, ortak değişkenler ve çoklu
Sanırım, birçok Servlets
tutan bir Web sunucusu var. Bilgi Servlets
bunlar arasında geçiş için Servlets
içeriği ve oturum değişkenleri belirliyorum.
Eğer 2 veya daha fazla kullanıcı, daha sonra oturum değişkenleri ne olur bu server için istek gönderin. Tüm kullanıcılar ya da her kullanıcı için farklı olacak ortak olacak. Eğer farklıysa, nasıl sunucu farklı kullanıcılar arasında ayırt etmek mümkün değildi.
Bir daha benzer bir soru, Eğer var *n*
kullanıcıların erişim belirli bir Servlets
Servlets
alır örneği sadece ilk kez ilk kullanıcı erişim veya rahatsız olmuyor örneği tüm kullanıcılar ayrı ayrı mı?
CEVAP
ServletContext
Bu servletcontainer (Apache Tomcat gibi) başladığında, dağıtmak ve tüm webapplications yük. Bir webapplication yüklü olduğunda, servletcontainer ServletContext
bir kez oluşturun ve sunucu hafızasında tutar. Web web.xml
incelenemeyecek ve her <servlet>
, <filter>
<listener>
bulundu web.xml
veya açıklamalı sırasıyla @WebServlet
, @WebFilter
@WebListener
, oluşturulacak bir kez ve tutulan sunucu belleği de. Tüm filtreler için, init()
yöntemi de hemen çağrılır. Ne zaman servletcontainer kapanır olacak boşaltın tüm webapplications çağır destroy()
tüm sunucu uygulamalarını başlatıldı ve filtreler, ve nihayet ServletContext
Servlet
, Filter
Listener
örnekleri olacak mahvetti.
Soru Servlet
<servlet><load-on-startup>
@WebServlet(loadOnStartup)
değeri 0
init()
yöntem daha var o da hemen başlatma sırasında çağrılır. Bu sunucu uygulamalarına" değerini temsil eder, ya da aynı, web.xml
@WebServlet
classloading. sipariş daha sonra ise "-başlangıç yük olarak aynı sırayla başlatılır Ya da," değeri yok, o zaman init()
Bu yöntem sadece ilk HTTP isteği söz konusu. sunucu uygulaması asılıyor çağrılacak "-yük-başlangıç ise
HttpServletRequest ve sunucunuz isteğe yanıt
Bu servletcontainer genellikle üretim geliştirme ve 80 8080 olan belirli bir bağlantı noktası numarası HTTP istekleri dinleyen bir Web sunucusu bağlıdır. Ne zaman bir istemci (kullanıcı ile bir tarayıcıda) gönderdiği bir HTTP isteği, servletcontainer oluşturur yeni HttpServletRequest
HttpServletResponse
nesneler ve o geçmesine yöntemleri önceden oluşturulmuş Filter
Servlet
örneklerini olan url-pattern
maçlar isteği URL, hepsi aynı konu.
Request nesnesi bir HTTP isteği başlık ve istek gövdesini gibi bilgilere erişim sağlar. Response nesnesi kontrol ve HTTP yanıtı istediğiniz şekilde göndermek için tesis, ayar başlıkları ve gövde (genellikle JSP dosyasından HTML içeriği ile) gibi sağlar. HTTP yanıtı kararlı ve bittiğinde, daha sonra istek ve yanıt nesneleri de yerle bir edilecek.
HttpSession
Ne zaman bir müşteri ziyaretleri Web uygulaması için ilk kez ve/veya HttpSession
için elde edilen ilk defa request.getSession()
, servletcontainer oluşturur, oluşturmak uzun ve benzersiz KİMLİĞİ (hangi sen-ebilmek almak session.getId()
), mağaza içinde sunucu belleği. Bu servletcontainer da Çerez değeri olarak çerez adı ve benzersiz bir oturum olarak JSESSIONID
HTTP yanıtı Set-Cookie
başlığında Cookie
KİMLİĞİ koyacaktır.
Yanı başına HTTP cookie specification (bir sözleşme iyi bir tarayıcı ve Web sunucusu vardır uymak), istemci (tarayıcı) gereklidir gönder Bu kurabiyeyi geri sonraki istekleri Cookie
başlık olarak çerez geçerli. Kullanarak tarayıcı yerleşik HTTP trafiği (F12 / Firefox23 / 9 Krom basın ve kontrol edin . onları kontrol edebilirsiniz monitör ^em>Net/Ağsekmesi). Bu servletcontainer belirleyecektir Cookie
başlık her gelen HTTP isteği için varlığının bir kimlik adı JSESSIONID
ve kullanım değeri (oturum KİMLİĞİ) ilişkili HttpSession
sunucu belleği.
HttpSession
<session-timeout>
saat, 30 dakika için varsayılan web.xml
, belirtebilirsiniz ayarı fazla kullanılmamış kadar yaşıyor. İstemci Web uygulaması artık 30 dakika gelmiyor, o zaman servletcontainer oturumu çöp olacak. Cookie ile belirtilen olsa bile sonraki her istek, aynı oturum artık erişebilir değil. Bu servletcontainer, yeni bir tane oluşturur.
Öte yandan, istemci tarafında oturum çerezi tarayıcı örneği çalıştığı sürece, varsayılan bir süresi vardır. İstemci tarayıcı örneği kapatır (tüm sekmeleri windows/), daha sonra oturum istemci tarafında yerle bir edilecek. Yeni bir tarayıcıda çerez oturumu ile ilgili artık gönderilmez. request.getSession()
yeni marka HttpSession
yeni döneceğini ve yeni bir oturum KİMLİĞİ ile bir çerez.
Özetle
ServletContext
hayatını " web-yaşadığı sürece. Arasında paylaşılmış oldutümistekleritümoturumları.HttpSession
hayatını sürece istemci aynı tarayıcı örneği ile web uygulaması ile etkileşim ve oturumu sunucu tarafında henüz zaman aşımına uğramıyor. Arasında paylaşılmış oldutümbu istekleriaynıoturum.HttpServletRequest
HttpServletResponse
istemci tam yanıt (web sayfası) geldi kadar gönderdi sürece yaşıyor.değilbaşka ortak olmak.Servlet
,Filter
Listener
web yaşadığı sürece yaşıyor. Arasında pay ediliyortümistekleritümoturumları.ServletContext
,HttpServletRequest
veHttpSession
ayarlayınattribute
herhangi bir uzun nesne olarak soru hayat yaşayacak.
Threadsafety
Bu büyük endişe muhtemelen olduğunu söyledithreadsafety. Şimdi sunucu uygulamalarına ve filtreler tüm istekleri arasında paylaşılan öğrenmiş olmalıdır. Java güzel bir şey, çok ve farklı konuları (HTTP istekleri) aynı örnek. Aksi takdirde her istek üzerine yeniden yaratmak için çok pahalı olurdu.
Ama aynı zamanda gerektiğini fark etmelisinizaslaherhangi bir istek ya da bir oturum olarak kapsamlı veri atamakörnekbir sunucu uygulaması ya da filtre değişken. Diğer oturumlarda tüm istekleri arasında paylaştırılmış olacak. Buthreadunsafe! Aşağıdaki örnek gösterir:
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.
}
}
Nasıl Java sunucu uygulamalarını Eclip...
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...
Veri bağlama Nasıl çalışır?AngularJS :...
Nasıl veritabanı indeksleme çalışır?...