4.1 Pengenalan kepada HttpSession

Jika beberapa permintaan datang dari klien yang sama, maka mereka mengatakan bahawa satu sesi telah diwujudkan antara klien dan pelayan. Untuk mengawal proses ini, bekas mempunyai objek HttpSession khas.

Apabila pelanggan membuat permintaan kepada servlet, bekas servlet menyemak untuk melihat sama ada parameter ID sesi hadir dalam permintaan. Jika tiada parameter sedemikian (contohnya, pelanggan menghubungi pelayan untuk kali pertama), maka bekas servlet mencipta objek HttpSession baharu dan turut memberikannya ID unik.

Objek sesi disimpan pada pelayan, dan ID dihantar dalam respons kepada klien, dan secara lalai disimpan pada klien dalam kuki. Kemudian, apabila permintaan baharu masuk daripada klien yang sama, bekas servlet mendapatkan semula ID daripadanya dan dengan ID itu menemui objek HttpSession yang betul pada pelayan.

Anda boleh mendapatkan objek sesi daripada permintaan (objek HttpServletRequest), yang mana anda perlu memanggil kaedah getSession(). Ia mengembalikan objek HttpSession.

Mengapa sesi diperlukan? Ia boleh menyimpan maklumat tentang pelanggan antara panggilan. Dia mempunyai sesuatu seperti HashMap di dalamnya, di mana anda boleh menyimpan objek dengan kekunci. Dan beberapa kaedah untuk ini:

Kaedah Penerangan
1 setAttribute(String name, Object o) Menambah objek pada sesi
2 getAttribute(String name) Mendapat objek daripada sesi
3 removeAttribute(String name) Mengalih keluar objek daripada sesi

Mari tulis servlet yang akan meringkaskan semua nombor yang dihantar kepadanya daripada permintaan yang berbeza:

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 Lagi mengenai HttpSession

Adakah terdapat apa-apa lagi yang kami tidak katakan tentang objek HttpSession?

Pertama, ia adalah nama J SESSION ID. Di bawahnya ID sesi disimpan dalam kuki. Seperti yang anda lihat, ia agak mudah diingati: J+SESSION+ID.

Kedua, sesi ini mempunyai beberapa kaedah yang lebih berguna:

Kaedah Penerangan
1 getAttributeNames() Mengembalikan senarai semua kunci yang disimpan dalam sesi
2 getId() Mengembalikan ID sesi (rentetan)
3 isNew() Mengembalikan benar jika objek sesi telah dibuat dalam permintaan semasa
4 setMaxInactiveInterval(int seconds) Menetapkan selang ketidakaktifan sesi dalam beberapa saat
5 invalidate() Mengalih keluar semua objek daripada sesi

Di sini semua kaedah adalah jelas, tetapi setMaxInactiveInterval()kita akan bercakap tentang lebih sedikit.

Jika pelayan menyimpan puluhan ribu sesi, termasuk data pelanggan yang melawatnya bulan lepas, maka ia akan kehabisan memori. Oleh itu, terdapat cara untuk menetapkan "seumur hidup sesi".

Jika tiada sesiapa yang menggunakan sesi untuk selang masa, maka ia mengosongkan dirinya sendiri - semua objek yang disimpan akan dipadamkan daripadanya. Ini dilakukan untuk menjimatkan memori.

Secara lalai, selang ini ialah 1800 saat == 30 minit. Jika anda menetapkan nilai kepada -1, maka sesi akan "kekal" dan akan dipadamkan hanya apabila pengguna menutup tab penyemak imbas (baik, atau pelanggan memutuskan sambungan).

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();