4.1 Panimula sa HttpSession

Kung ang ilang mga kahilingan ay nagmula sa parehong kliyente, pagkatapos ay sinasabi nila na ang isang sesyon ay naitatag sa pagitan ng kliyente at ng server. Upang kontrolin ang prosesong ito, ang lalagyan ay may espesyal na object ng HttpSession.

Kapag humiling ang isang kliyente sa isang servlet, susuriin ng lalagyan ng servlet upang makita kung ang parameter ng session ID ay naroroon sa kahilingan. Kung walang ganoong parameter (halimbawa, ang kliyente ay nakikipag-ugnayan sa server sa unang pagkakataon), pagkatapos ay ang servlet container ay gagawa ng bagong HttpSession object at nagtatalaga rin ito ng isang natatanging ID.

Ang session object ay naka-imbak sa server, at ang ID ay ipinadala sa tugon sa client, at bilang default ay naka-imbak sa client sa isang cookie. Pagkatapos, kapag may bagong kahilingan na dumating mula sa parehong kliyente, kinukuha ng servlet container ang ID mula rito, at sa pamamagitan ng ID na iyon ay mahahanap ang tamang HttpSession object sa server.

Makukuha mo ang object ng session mula sa isang kahilingan (isang HttpServletRequest object), kung saan kailangan mong tawagan ang getSession() method. Nagbabalik ito ng object ng HttpSession.

Bakit kailangan ng session? Maaari itong mag-imbak ng impormasyon tungkol sa kliyente sa pagitan ng mga tawag. Mayroon siyang isang HashMap sa loob, kung saan maaari kang mag-imbak ng mga bagay sa pamamagitan ng mga susi. At ilang mga pamamaraan para dito:

Paraan Paglalarawan
1 setAttribute(String name, Object o) Nagdaragdag ng object sa session
2 getAttribute(String name) Nakakakuha ng object mula sa session
3 removeAttribute(String name) Tinatanggal ang isang bagay mula sa session

Sumulat tayo ng isang servlet na magbubuod ng lahat ng mga numerong ipinasa dito mula sa iba't ibang mga kahilingan:

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 Higit pa tungkol sa HttpSession

Mayroon bang anumang bagay na hindi namin nasabi tungkol sa object ng HttpSession?

Una, ito ang pangalang J SESSION ID. Nasa ilalim nito na nakaimbak ang session ID sa cookies. Gaya ng nakikita mo, medyo madaling tandaan: J+SESSION+ID.

Pangalawa, ang session ay may ilang mas kapaki-pakinabang na pamamaraan:

Paraan Paglalarawan
1 getAttributeNames() Nagbabalik ng listahan ng lahat ng key na nakaimbak sa session
2 getId() Ibinabalik ang session ID (string)
3 isNew() Nagbabalik ng true kung ginawa ang object ng session sa kasalukuyang kahilingan
4 setMaxInactiveInterval(int seconds) Itinatakda ang agwat ng kawalan ng aktibidad ng session sa mga segundo
5 invalidate() Tinatanggal ang lahat ng mga bagay mula sa session

Narito ang lahat ng mga pamamaraan ay halata, ngunit setMaxInactiveInterval()pag-uusapan natin ang tungkol sa kaunti pa.

Kung ang server ay nag-iimbak ng sampu-sampung libong mga session, kabilang ang data ng mga kliyente na bumisita dito noong nakaraang buwan, kung gayon ito ay mauubusan lamang ng memorya. Samakatuwid, mayroong isang paraan upang itakda ang "habambuhay ng session".

Kung walang gumamit ng session para sa isang agwat ng oras, pagkatapos ay nililimas nito ang sarili nito - lahat ng mga bagay na inimbak nito ay tinanggal mula dito. Ginagawa ito upang makatipid ng memorya.

Bilang default, ang agwat na ito ay 1800 segundo == 30 minuto. Kung itatakda mo ang halaga sa -1, ang session ay magiging "walang hanggan" at tatanggalin lamang kapag isinara ng user ang tab ng browser (mabuti, o ang kliyente ay nagdiskonekta).

Mga halimbawa:

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