4.1 Pengantar HttpSession

Jika beberapa permintaan datang dari klien yang sama, maka dikatakan bahwa sesi dibuat antara klien dan server. Untuk mengontrol proses ini, wadah memiliki objek khusus HttpSession.

Saat klien membuat permintaan ke servlet, wadah servlet memeriksa untuk melihat apakah parameter ID sesi ada dalam permintaan. Jika tidak ada parameter seperti itu (misalnya, klien menghubungi server untuk pertama kalinya), wadah servlet akan membuat objek HttpSession baru dan juga memberinya ID unik.

Objek sesi disimpan di server, dan ID dikirim sebagai respons ke klien, dan secara default disimpan di klien dalam cookie. Kemudian, ketika permintaan baru datang dari klien yang sama, wadah servlet mengambil ID darinya, dan dengan ID tersebut menemukan objek HttpSession yang benar di server.

Anda bisa mendapatkan objek sesi dari permintaan (objek HttpServletRequest), di mana Anda perlu memanggil metode getSession() . Ini mengembalikan objek HttpSession.

Mengapa sesi diperlukan? Itu dapat menyimpan informasi tentang klien di antara panggilan. Dia memiliki sesuatu seperti HashMap di dalamnya, di mana Anda dapat menyimpan objek dengan kunci. Dan beberapa metode untuk ini:

Metode Keterangan
1 setAttribute(String name, Object o) Menambahkan objek ke sesi
2 getAttribute(String name) Mendapat objek dari sesi
3 removeAttribute(String name) Menghapus objek dari sesi

Mari kita tulis sebuah servlet yang akan meringkas semua angka yang diteruskan dari berbagai permintaan:

public class CalculatorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
         // Get the "sum" attribute from the session
        HttpSession session = request.getSession();
        Integer sum = (Integer) session.getAttribute("sum");
        //Handling the situation when the session does not yet have such an attribute
        if (sum == null)
            sum = 0;

         // Get the "n" parameter from the request
        String n = request.getParameter("n");
        sum += Integer.parseInt(n);

         // Write the "sum" attribute to the session
        session.setAttribute("sum", sum);

        // Print the HTML as a response to the browser
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head> <title> CalculatorServlet </title> </head>");
        out.println("<body>");
        out.println("<h1> Sum == " + sum + "</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

4.2 Lebih lanjut tentang HttpSession

Apakah ada hal lain yang belum kami katakan tentang objek HttpSession?

Pertama, itu adalah nama J SESSION ID. Di bawahnya ID sesi disimpan dalam cookie. Seperti yang Anda lihat, cukup mudah diingat: J+SESSION+ID.

Kedua, sesi ini memiliki beberapa metode yang lebih berguna:

Metode Keterangan
1 getAttributeNames() Mengembalikan daftar semua kunci yang disimpan dalam sesi
2 getId() Mengembalikan ID sesi (string)
3 isNew() Mengembalikan nilai true jika objek sesi dibuat dalam permintaan saat ini
4 setMaxInactiveInterval(int seconds) Menyetel interval tidak aktif sesi dalam hitungan detik
5 invalidate() Menghapus semua objek dari sesi

Di sini semua metode sudah jelas, tetapi setMaxInactiveInterval()kita akan membicarakan lebih banyak lagi.

Jika server menyimpan puluhan ribu sesi, termasuk data klien yang mengunjunginya bulan lalu, maka server akan kehabisan memori. Oleh karena itu, ada cara untuk menyetel "masa hidup sesi".

Jika tidak ada yang menggunakan sesi untuk selang waktu tertentu, maka sesi akan dihapus dengan sendirinya - semua objek yang disimpannya akan dihapus darinya. Ini dilakukan untuk menghemat memori.

Secara default, interval ini adalah 1800 detik == 30 menit. Jika Anda menyetel nilainya ke -1, maka sesi akan menjadi "abadi" dan akan dihapus hanya ketika pengguna menutup tab browser (baik, atau klien terputus).

Contoh:

// get all keys
Enumeration keys = session.getAttributeNames();
while( keys.hasMoreElements() ){
    System.out.println( (String) keys.nextElement() );
}
// set the inactivity interval
session.setMaxInactiveInterval(60*60*24);   // 1 day
session.setMaxInactiveInterval(-1); // until the browser is closed
// remove all data from the session
session.invalidate();