ServletContext
Ketika wadah servlet (seperti Apache Tomcat ) mulai, itu akan menyebarkan dan memuat semua aplikasi webnya. Ketika aplikasi web dimuat, wadah servlet membuat ServletContext
sekali dan menyimpannya di memori server. Aplikasi web web.xml
dan semua web-fragment.xml
file yang disertakan diuraikan, dan masing-masing <servlet>
, <filter>
dan <listener>
ditemukan (atau masing-masing kelas dijelaskan dengan @WebServlet
, @WebFilter
dan @WebListener
masing - masing) dipakai satu kali dan disimpan dalam memori server juga. Untuk setiap filter instantiated, init()
metodenya dipanggil dengan yang baru FilterConfig
.
Ketika Servlet
memiliki <servlet><load-on-startup>
atau @WebServlet(loadOnStartup)
nilai lebih besar dari 0
, maka init()
metode ini juga dipanggil saat startup dengan yang baru ServletConfig
. Servlet tersebut diinisialisasi dalam urutan yang sama yang ditentukan oleh nilai tersebut ( 1
adalah 1, 2
2, dll). Jika nilai yang sama ditetapkan untuk lebih dari satu servlet, maka masing-masing servlets dimuat dalam urutan yang sama seperti yang muncul dalam web.xml
, web-fragment.xml
atau @WebServlet
classloading. Jika nilai "load-on-startup" tidak ada, init()
metode akan dipanggil kapan saja permintaan HTTP mengenai servlet untuk pertama kalinya.
Ketika wadah servlet selesai dengan semua langkah inisialisasi yang dijelaskan di atas, maka ServletContextListener#contextInitialized()
akan dipanggil.
Ketika servlet kontainer menutup, itu membongkar semua aplikasi web, memanggil destroy()
metode semua servlets yang diinisialisasi dan filter, dan semua ServletContext
, Servlet
, Filter
dan Listener
contoh yang menghancurkan. Akhirnya ServletContextListener#contextDestroyed()
akan dipanggil.
HttpServletRequest dan HttpServletResponse
Wadah servlet dilampirkan ke server web yang mendengarkan permintaan HTTP pada nomor port tertentu (port 8080 biasanya digunakan selama pengembangan dan port 80 dalam produksi). Ketika klien (misalnya pengguna dengan browser web, atau menggunakan programURLConnection
) mengirim permintaan HTTP, wadah servlet membuat objek HttpServletRequest
dan baru HttpServletResponse
dan melewati mereka melalui apa pun yang ditentukan Filter
dalam rantai dan, akhirnya, Servlet
instance.
Dalam kasus filter , doFilter()
metode dipanggil. Ketika kode penampung servlet memanggil chain.doFilter(request, response)
, permintaan dan tanggapan berlanjut ke filter berikutnya, atau tekan servlet jika tidak ada filter yang tersisa.
Dalam kasus servlets , service()
metode dipanggil. Secara default, metode ini menentukan salah satu doXxx()
metode yang akan digunakan berdasarkan request.getMethod()
. Jika metode yang ditentukan tidak ada dari servlet, maka kesalahan HTTP 405 dikembalikan dalam respons.
Objek permintaan menyediakan akses ke semua informasi tentang permintaan HTTP, seperti URL, header, string kueri, dan badan. Objek respons memberikan kemampuan untuk mengontrol dan mengirim respons HTTP seperti yang Anda inginkan, misalnya, memungkinkan Anda untuk mengatur header dan isi (biasanya dengan konten HTML yang dihasilkan dari file JSP). Ketika respons HTTP dilakukan dan diselesaikan, objek permintaan dan respons didaur ulang dan tersedia untuk digunakan kembali.
HttpSession
Ketika klien mengunjungi webapp untuk pertama kalinya dan / atau HttpSession
diperoleh untuk pertama kalinya melalui request.getSession()
, wadah servlet membuat HttpSession
objek baru , menghasilkan ID panjang dan unik (yang bisa Anda dapatkan session.getId()
), dan menyimpannya di server. Penyimpanan. Wadah servlet juga menetapkan a Cookie
di Set-Cookie
header respons HTTP dengan JSESSIONID
sebagai namanya dan ID sesi unik sebagai nilainya.
Sesuai spesifikasi cookie HTTP (kontrak yang harus dipatuhi oleh setiap browser web dan server web yang layak), klien (browser web) diharuskan untuk mengirim cookie ini kembali dalam permintaan berikutnya di Cookie
header selama cookie tersebut valid (cookie tersebut valid) yaitu ID unik harus merujuk ke sesi yang tidak kedaluwarsa dan domain dan jalurnya benar). Menggunakan monitor lalu lintas HTTP bawaan browser Anda, Anda dapat memverifikasi bahwa cookie tersebut valid (tekan F12 di Chrome / Firefox 23+ / IE9 +, dan periksa tab Net / Network ). Wadah servlet akan memeriksa Cookie
tajuk setiap permintaan HTTP yang masuk untuk mengetahui keberadaan cookie dengan nama JSESSIONID
dan menggunakan nilainya (ID sesi) untuk mendapatkan yang terkait HttpSession
dari memori server.
The HttpSession
tetap hidup sampai telah diam (yaitu tidak digunakan dalam permintaan) untuk lebih dari nilai batas waktu yang ditentukan dalam <session-timeout>
, pengaturan di web.xml
. Nilai batas waktu default ke 30 menit. Jadi, ketika klien tidak mengunjungi aplikasi web lebih lama dari waktu yang ditentukan, wadah servlet merusak sesi. Setiap permintaan berikutnya, bahkan dengan cookie yang ditentukan, tidak akan memiliki akses ke sesi yang sama lagi; wadah servlet akan membuat sesi baru.
Di sisi klien, cookie sesi tetap hidup selama instance browser berjalan. Jadi, jika klien menutup instance browser (semua tab / windows), maka sesi tersebut dibuang ke sisi klien. Dalam instance browser baru, cookie yang terkait dengan sesi tidak akan ada, sehingga cookie tidak akan lagi dikirim. Hal ini menyebabkan pembuatan yang sama sekali baru HttpSession
, dengan cookie sesi yang sama sekali baru digunakan.
Pendeknya
- The
ServletContext
hidup selama kehidupan aplikasi web. Itu dibagikan di antara semua permintaan di semua sesi.
- The
HttpSession
hidup selama klien berinteraksi dengan aplikasi web dengan contoh browser yang sama, dan sesi belum habis waktunya di sisi server. Itu dibagikan di antara semua permintaan dalam sesi yang sama .
- Itu
HttpServletRequest
dan HttpServletResponse
hidup dari saat servlet menerima permintaan HTTP dari klien, sampai respons lengkap (halaman web) telah tiba. Itu tidak dibagikan di tempat lain.
- Semua
Servlet
, Filter
dan Listener
contoh hidup selama aplikasi web hidup. Mereka dibagikan di antara semua permintaan di semua sesi.
- Apa pun
attribute
yang didefinisikan ServletContext
, HttpServletRequest
dan HttpSession
akan hidup selama objek yang dipermasalahkan hidup. Objek itu sendiri mewakili "ruang lingkup" dalam kerangka kerja manajemen kacang seperti JSF, CDI, Spring, dll. Kerangka kerja tersebut menyimpan kacang scoping mereka sebagai attribute
lingkup pencocokan terdekat.
Keamanan Thread
Yang mengatakan, perhatian utama Anda mungkin keamanan benang . Anda sekarang harus tahu bahwa servlet dan filter dibagikan di antara semua permintaan. Itu hal yang menyenangkan tentang Java, itu multithreaded dan utas berbeda (baca: permintaan HTTP) dapat menggunakan contoh yang sama. Kalau tidak akan terlalu mahal untuk dibuat ulang, init()
dan destroy()
mereka untuk setiap permintaan tunggal.
Anda juga harus menyadari bahwa Anda tidak boleh menetapkan permintaan atau data cakupan sesi sebagai variabel instan dari servlet atau filter. Ini akan dibagikan di antara semua permintaan lain di sesi lain. Itu bukan thread-safe! Contoh di bawah menggambarkan ini:
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.
}
}
Lihat juga: