SORU
24 HAZİRAN 2010, PERŞEMBE


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
24 HAZİRAN 2010, PERŞEMBE


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 ve HttpSession ayarlayın attribute 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.
    } 
}

Ayrıca Bkz:

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • footiecyclo

    footiecyclo

    26 EYLÜL 2009
  • Megan Parken

    Megan Parken

    19 Temmuz 2009