4.1 HttpSession এর ভূমিকা

যদি একই ক্লায়েন্ট থেকে একাধিক অনুরোধ আসে, তাহলে তারা বলে যে ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি সেশন প্রতিষ্ঠিত হয়েছে। এই প্রক্রিয়া নিয়ন্ত্রণ করতে, ধারকটিতে একটি বিশেষ HttpSession অবজেক্ট রয়েছে।

যখন একটি ক্লায়েন্ট একটি সার্লেটে একটি অনুরোধ করে, তখন সার্লেট কন্টেইনারটি সেশন আইডি প্যারামিটারটি অনুরোধে উপস্থিত আছে কিনা তা পরীক্ষা করে। যদি এই ধরনের কোনো প্যারামিটার না থাকে (উদাহরণস্বরূপ, ক্লায়েন্ট প্রথমবারের জন্য সার্ভারের সাথে যোগাযোগ করছে), তাহলে servlet কন্টেইনার একটি নতুন HttpSession অবজেক্ট তৈরি করে এবং এটি একটি অনন্য আইডি বরাদ্দ করে।

সেশন অবজেক্ট সার্ভারে সংরক্ষণ করা হয়, এবং আইডিটি ক্লায়েন্টের প্রতিক্রিয়াতে পাঠানো হয় এবং ডিফল্টরূপে ক্লায়েন্টে একটি কুকিতে সংরক্ষণ করা হয়। তারপর, যখন একই ক্লায়েন্ট থেকে একটি নতুন অনুরোধ আসে, তখন সার্লেট কন্টেইনার আইডিটি পুনরুদ্ধার করে এবং সেই আইডি দ্বারা সার্ভারে সঠিক HttpSession অবজেক্ট খুঁজে পায়।

আপনি একটি অনুরোধ (একটি HttpServletRequest অবজেক্ট) থেকে সেশন অবজেক্ট পেতে পারেন, যার উপর আপনাকে getSession() পদ্ধতিতে কল করতে হবে। এটি একটি HttpSession অবজেক্ট প্রদান করে।

কেন একটি অধিবেশন প্রয়োজন? এটি কলের মধ্যে ক্লায়েন্ট সম্পর্কে তথ্য সংরক্ষণ করতে পারে। তার ভিতরে হ্যাশম্যাপের মতো কিছু আছে, যেখানে আপনি কী দ্বারা বস্তু সংরক্ষণ করতে পারেন। এবং এর জন্য কিছু পদ্ধতি:

পদ্ধতি বর্ণনা
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.

দ্বিতীয়ত, অধিবেশনে আরও কয়েকটি দরকারী পদ্ধতি রয়েছে:

পদ্ধতি বর্ণনা
1 getAttributeNames() সেশনে সংরক্ষিত সমস্ত কীগুলির একটি তালিকা প্রদান করে
2 getId() সেশন আইডি (স্ট্রিং) প্রদান করে
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();