4.1 รู้เบื้องต้นเกี่ยวกับ HttpSession

หากคำขอหลายรายการมาจากไคลเอ็นต์เดียวกัน แสดงว่ามีการสร้างเซสชันระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ เพื่อควบคุมกระบวนการนี้ คอนเทนเนอร์มีวัตถุ HttpSession พิเศษ

เมื่อไคลเอ็นต์ส่งคำขอไปยังเซิร์ฟเล็ต คอนเทนเนอร์เซิร์ฟเล็ตจะตรวจสอบเพื่อดูว่ามีพารามิเตอร์ ID เซสชันอยู่ในคำขอหรือไม่ หากไม่มีพารามิเตอร์ดังกล่าว (ตัวอย่างเช่น ไคลเอ็นต์กำลังติดต่อกับเซิร์ฟเวอร์เป็นครั้งแรก) ดังนั้นคอนเทนเนอร์เซิร์ฟเล็ตจะสร้างออบเจกต์ HttpSession ใหม่และกำหนด ID เฉพาะให้กับมันด้วย

วัตถุเซสชันถูกเก็บไว้บนเซิร์ฟเวอร์ และ ID ถูกส่งไปในการตอบกลับไปยังไคลเอนต์ และโดยค่าเริ่มต้นจะถูกเก็บไว้ในไคลเอ็นต์ในคุกกี้ จากนั้น เมื่อมีคำขอใหม่เข้ามาจากไคลเอ็นต์เดียวกัน คอนเทนเนอร์เซิร์ฟเล็ตจะดึง ID จากคำขอนั้น และโดย ID นั้นจะค้นหาวัตถุ HttpSession ที่ถูกต้องบนเซิร์ฟเวอร์

คุณสามารถรับวัตถุเซสชันจากคำขอ (วัตถุ HttpServletRequest) ซึ่งคุณต้องเรียกใช้เมธอด getSession() มันส่งคืนวัตถุ HttpSession

เหตุใดจึงจำเป็นต้องมีเซสชัน สามารถเก็บข้อมูลเกี่ยวกับลูกค้าระหว่างการโทร เธอมีบางอย่างเช่น HashMap อยู่ข้างในซึ่งคุณสามารถเก็บวัตถุได้ด้วยกุญแจ และวิธีการบางอย่างสำหรับสิ่งนี้:

วิธีการ คำอธิบาย
1 setAttribute(String name, Object o) เพิ่มวัตถุในเซสชัน
2 getAttribute(String name) รับวัตถุจากเซสชัน
3 removeAttribute(String name) ลบวัตถุออกจากเซสชัน

มาเขียนเซิร์ฟเล็ตที่จะรวมตัวเลขทั้งหมดที่ส่งผ่านไปยังคำขอต่างๆ:

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 เพิ่มเติมเกี่ยวกับ HttpSession

มีอะไรอีกที่เรายังไม่ได้พูดเกี่ยวกับวัตถุ HttpSession?

อย่างแรกคือชื่อ J SESSION ID อยู่ภายใต้ ID เซสชันนั้นถูกเก็บไว้ในคุกกี้ อย่างที่คุณเห็น มันค่อนข้างง่ายที่จะจำ: J+SESSION+ID.

ประการที่สอง เซสชันมีวิธีการที่เป็นประโยชน์เพิ่มเติมสองสามวิธี:

วิธีการ คำอธิบาย
1 getAttributeNames() ส่งคืนรายการคีย์ทั้งหมดที่จัดเก็บไว้ในเซสชัน
2 getId() ส่งกลับ ID เซสชัน (สตริง)
3 isNew() คืนค่าจริงหากวัตถุเซสชันถูกสร้างขึ้นในคำขอปัจจุบัน
4 setMaxInactiveInterval(int seconds) ตั้งค่าช่วงเวลาไม่มีการใช้งานเซสชันเป็นวินาที
5 invalidate() ลบวัตถุทั้งหมดออกจากเซสชัน

วิธีการทั้งหมดนั้นชัดเจน แต่setMaxInactiveInterval()เราจะพูดถึงอีกเล็กน้อย

หากเซิร์ฟเวอร์จัดเก็บเซสชันหลายหมื่นเซสชัน รวมถึงข้อมูลของลูกค้าที่เข้าชมเมื่อเดือนที่แล้ว หน่วยความจำก็จะไม่เพียงพอ ดังนั้นจึงมีวิธีการตั้งค่า "อายุเซสชัน"

หากไม่มีใครใช้เซสชันในช่วงเวลาหนึ่งก็จะล้างตัวเอง - วัตถุทั้งหมดที่เก็บไว้จะถูกลบออกจากมัน สิ่งนี้ทำเพื่อบันทึกหน่วยความจำ

ตามค่าเริ่มต้น ช่วงเวลานี้คือ 1800 วินาที == 30 นาที หากคุณตั้งค่าเป็น -1 เซสชันจะเป็น "นิรันดร์" และจะถูกลบเฉพาะเมื่อผู้ใช้ปิดแท็บเบราว์เซอร์ (หรือไคลเอ็นต์ยกเลิกการเชื่อมต่อ)

ตัวอย่าง:

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