November 3, 2011

ကွတ်ကီးနှင့် ဆက်ရှင်

ယနေ့ခေတ် အသုံးပြုနေသော HTTP ပရိုတိုကောသည် အနေအထားကို ဖော်ပြနိုင်ခြင်း မရှိပေ။ အစဉ်မပြတ် ရရှိလာသော Request များအတွင်းတွင် တစ်စုံတစ်ယောက်ထံမှ Request များဖြစ်သည်ဟု Server မှ သိရှိနိုင်ရန် ပြင်ဆင်ထားခြင်းမရှိပေ။ Privacy ကို ကြွေးကြော်သူများက ထိုအရာကို သင့်တော်သည့်လုပ်ဆောင်ချက်ဟု ကျေနပ်ကြမည်ဖြစ်သော်လည်း၊ Web Programmer အတော်များများအတွက်တော့ ခေါင်းကိုက်စရာ အချက်တစ်ခု ဖြစ်ပါသည်။ အဘယ်ကြောင့်ဆိုသော် Web Application တစ်ခုသည် အနေအထားကို သိရှိရန်လိုအပ်သောကြောင့် ဖြစ်ပါသည်။ Web Application တစ်ခုသည်၊ အသုံးပြုသူနှင့်အပြန်အလှန် ဆက်သွယ်ရာတွင် အသုံးပြုသူ၏အချက်အလက်များကို Request များကြား၌ မှတ်သားထားရန် လိုအပ်ပါသည်။
ဥပမာအားဖြင့် Online Shopping Cart တစ်ခုဆိုလျှင်၊ အသုံးပြုသူက စာမျက်နှာအတော်များများကို သွားကြည့်၊ ဝယ်ယူရန်သိမ်းဆည်းထားသော ပစ္စည်းများကို မှတ်သားထားရန်လိုအပ်ပါသည်။ လိုအပ်လာပါက နောက်ရက်ပေါင်းအတန်ကြာအထိ မှတ်ထားရမည်ဖြစ်သည်။ အကယ်၍ Server က အခြေအနေများကို မှတ်သားခြင်းမပြုနိုင်ပါက မည်သူကမည်သည့်ပစ္စည်းကို ဝယ်ယူမည်ဆိုသည့်အချက်ကို သိရှိနိုင်မည်မဟုတ်ပေ။
ထို့ကြောင့် Enterprise Application များတွင် Server က အခြေအနေကို မှတ်မိနိုင်ရန် နည်းအမျိုးမျိုးကို အသုံးပြုနေခဲ့ကြသည်။ ထင်ရှားသောနည်းများမှာ အောက်ပါအတိုင်းဖြစ်ကြသည်။
  • User Authentication
    အသုံးပြုသူ Log in ချိန်တွင် ရရှိသော အချက်အလက်များကို ပြန်လည်အသုံးပြုသော နည်းဖြစ်၏။ သို့ရာတွင် Log in ကိုတောင်းဆိုသော ဆိုက်မှသာလျှင် အသုံးပြုနိုင်သောနည်း ဖြစ်ပါသည်။ အသုံးပြုသူက Log In ချိန်တွင် Browser က အမည်နှင့် Pass Word ကို မှတ်သားထားပြီး၊ ထိုဆိုက်အတွင်းမှ အခြားသောစာမျက်နှာများကို ကူးပြောင်းချိန်တွင် မှတ်သားထားသော အချက်အလက်များကို ဆက်လက်၍ Request လုပ်နိုင်ပါသည်။ ထို့အတွက် Server ဘက်တွင် HttpServletRequest#getRemoteUser လုပ်ဆောင်ချက်ဖြင့် အသုံးပြုသူကို သိရှိနိုင်ပေသည်။ ထိုအသုံးပြုသူဖြင့်၊ Session ကို အသုံးပြုပြီး Server ဘက်မှ Request များ၏ အနေအထားကို သိရှိနိုင်ပေသည်။
  • Hidden Input Fields
    နောက်တစ်နည်းမှာ Servlet က စာမျက်နှာများကို ရေးသားရာတွင်၊ FORM Tag ၏ လျှို့ဝှက် IMPUT  များကို အသုံးပြုနိုင်ပါသည်။ အသုံးပြုသူနှင့် အပြန်အလှန် ဆက်သွယ်ထားသော အချက်အလက်များကို၊ နောက်စာမျက်နှာတစ်ခု ရေးသားချိန်တွင် Hidden Input Fields များကို အသုံးပြု၍ ရေးသားစေပြီး၊ ထိုစာမျက်နှာမှ Request လာသောအခါ ယခင်ရေးမှတ်လိုက်သော အချက်အလက်များကို ပြန်လည်ရယူခြင်းအားဖြင့် Server ဘက်မှ လက်ရှိအခြေအနေကို မှတ်သားခြင်း ပြုလုပ်နိုင်ပေသည်။Servlet မှ Form မှ Input တန်ဖိုးများကို HttpServletRequest#getParameterValues ဖြင့် ရယူနိုင်ပါသည်။
  • URL ကို ပြုပြင်ရေးသားခြင်း
    အထက်ပါနည်းနှင့် ခပ်ဆင်ဆင်နည်းဖြစ်ပါသည်။ Servlet မှ စာမျက်နှာတစ်ခုကို ရေးသားရာတွင်၊ အသုံးပြုလိုသည့် Link များ၏ URL တွင် လိုအသော အချက်အလက်ကို ရေးသားစေခြင်းဖြင့်၊ Server မှ လက်ရှိအခြေအနေကို မှတ်သားနိုင်ပါသည်။ Servlet မှ Request Parameter ၏ တန်ဖိုးများကို HttpServletRequest#getPathInfo ဖြင့် ရယူနိုင်ပါသည်။
  • Cookie
    တဖန် Server မှ အသုံးပြုသူ၏ Browser  အပေါ်တွင် သက်မှတ်ထားလိုသည့်အချက်အလက်များကို HTTP Header တွင်ဖြည့်စွက်သောနည်း ကိုလည်း အသုံးပြုပါသေးသည်။ ဤကဲ့သို့သော Server နှင့် Client ၏ Browser ၏ အကြားတွင် အချက်အလက်များကို အပြန်အလှန်အသုံးပြုနေသည့် Memory နေရာသို့မဟုတ် ပရိုတိုကောကို ကွတ်ကီး ဟုခေါ်ဆိုပေသည်။ ကွတ်ကီးအကြောင်းကို နမှုနာနှင့်တကွ ဖော်ပြသွားပါဦးမည်။
  • Session
    ကွတ်ကီးကို အသုံးပြု၍ Server နှင့် Client အကြားတွင် အချက်အလက်များကို အပြန်အလှန်အသုံးပြုနိုင်ပါသည်။ သို့ရာတွင် Server နှင့် Client အကြားတွင် အချက်အလက်များကို အသွားအပြန်အသုံးပြုသည့် ပမာဏမှာ များပြားလေလေ၊ အဲ့ဒီအချက်လက်များကို အကြိမ်တိုင်အပြန်အလှန် သယ်ယူပို့ဆောင်နေရသည်မှာ အတော်ပင် အဓိပ္ပါယ်မဲ့လှပေသည်။ ရှားပါးလှသည့် ကွန်နက်ရှင်းကို ပမာဏများများနှင့် အသုံးပြုလေလေ Performance ကျဆင်းလေလေ ဖြစ်ပေလိမ့်မည်။ ထို့အတွက် Client ဖြင့် လိုအပ်သောအချက်အလက်များကိုသာ အဆက်အသွယ်လုပ်ပြီး၊ လိုအပ်သော အချက်အလက်များကို Server အပေါ်တွင် ခေတ္တသိမ်းဆည်းထားနိုင်ရန် နေရာများကို ပြင်ဆင်လာကြ ပါသည်။ ထိုကဲ့သို့သော မံမိုရီနေရာများကို session ဟုခေါ်ပါသည်။
User Authentication နှင့်ပတ်သက်၍၊ နောက်ပိုင်း Security နှင့်အတူဖော်ပြရန် စီစဉ်ထားပါသောကြောင့်၎င်း၊ Hidden Input Fields များကို အသုံးပြုခြင်းနှင့် URL ကို ပြုပြင်ရေးသားခြင်းမှာ၊ ယနေ့တိုင် ဖော်ပြခဲ့သော ရေးသားပုံကိုအသုံးပြုပါက အလွယ်တကူရေးသားနိုင်သောကြောင့် ဤဘလောဂ်တွင် ဖော်ပြတော့မည်မဟုတ်ပေ။


Cookie
 Cookie ဆိုသည်မှာ HTTP ကို အသုံးပြု၍ Web Server နှင့် Browser တို့၏ကြားတွင် အနေအထားကို ထိမ်းသိမ်းပေးထားနိုင်သော ပရိုတိုကော သို့မဟုတ်၊ အနေအထားကို သိမ်းဆည်းပေးထားသော အရာများကို ဆိုလိုပါသည်။ Servlet သည် javax.servlet.http.Cookie ကို အသုံးပြု၍ Cookie ၏ အချက်အလက်များကို အသုံးချနိုင်ပါသည်။ Server မှ Response လုပ်သည့်အခါ Http Header တွင် စာကြောင်းအဖြစ် ဖြည့်စွက်ခြင်းအားဖြင့် Cookie အချက်အလက်များကို Browser နှင့် Server ကြားတွင် အသုံးပြုနေခြင်း ဖြစ်ပါသည်။ Http Header တွင် ဖြည့်စွက် အသုံးပြုနေသည့် စာကြောင်းမှာ အောက်ပါအတိုင်းဖြစ်ပါသည်။
Set-Cookie: NAME=VALUE; Max-Age=DATE; path=PATH; domain=DOMAIN_NAME; version=VERSION; comment=COMMENT; secure

NAME=VALUE ကွတ်ကီး၏ အမည်နှင့်တန်ဖိုး ဖြစ်ပါသည်။ ဥပမာ ID=56ဆိုပါက၊ ID သည် ကွတ်ကီး၏အမည် ဖြစ်ပြီး၊ 56 သည် တန်ဖိုးဖြစ်၏။
Cookie class ၏Constructor သည် Cookie(String,String) ကဲ့သို့ အမည်နှင့် တန်ဖိုးကို တပါတည်း ရေးသားပြီး၊ တန်ဖိုးကိုပြောင်းလည်းလိုပါက Cookie#setValue လုပ်ဆောင်ချက်ကို၎င်း၊ အမည်ကိုရယူရာ၌ Cookie#getName ကို ၎င်း၊ တန်ဖိုးကို ရယူရာ၌ Cookie#getValue လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်ပါသည်။
Max-Age=DATE ကွတ်ကီး၏ သက်တမ်းကို သတ်မှတ်ရာတွင် အသုံးပြုနိုင်ပါသည်။ Max-Age=1000 ကဲ့သို့ရေးသားထားပါက ထိုကွတ်သီး၏ သက်တမ်းသည် 1000 s ရှိသည် ဟုသိရှိနိုင်ပါသည်။ စက္ကန့် 1000 အကြာတွင် သုံး၍ရမည် မဟုတ်တော့ပေ။ တဖန် အနုတ်ကိန်း သို့မဟုတ် သက်မှတ်ခြင်း မရှိပါက Browser မပိတ်မချင်း အသုံးပြုနိုင်ပါသည်။ တဖန် 0 ဟု ရေးသားလိုက်ပါက၊ Browser တွင်ရှိသော ထိုကွတ်ကီးကို ဖျက်ပစ်လိုက်မည် ဖြစ်သည်။ ကွတ်ကီးကို သတ်မှတ်ရာတွင် setMasAge ကို အသုံးပြု၍၊ တန်ဖိုးကို ရယူရာတွင် getMaxAge ကို အသုံးပြုနိုင်ပါသည်။
path=PATH ကွတ်ကီးအား ဆက်သွယ်နိုင်သည့် Path ကို သက်မှတ်ရာတွင် အသုံးပြုနိုင်ပါသည်။ setPath နှင့် getPath လုပ်ဆောင်ချက်များကို အသုံးပြုနိုင်ပါသည်။
domain=DOMAIN_NAME ကွတ်ကီးအား ပြန်လည်ပေးပို့ရမည့် ဆာဗာ ဒိုမိန်းအမည်ကို သက်မှတ်ရာတွင် အသုံးပြုနိုင်ပါသည်။ ရေးသားထားခြင်းမရှိပါက ကွတ်ကီးအား Browser ဆီသို့ပေးပို့လိုက်သော ဆာဗာဒိုမိန်းကို အသုံးပြုမည်ဖြစ်သည်။ setDomain နှင့် getDomain ကို အသုံးပြုနိုင်မည် ဖြစ်သည်။
version=VERSION ကွတ်ကီး ၏ ဗားရှင်းကို သတ်မှတ်ရာတွင် အသုံးပြုနိုင်ပေသည်။ 0 ဆိုပါက Netscape ၏ သတ်မှတ်ချက် ဗားရှင်းဖြစ်ပြီး၊ 1 ဆိုပါက RFC2109 သည်၊ Default တန်ဖိုးဖြစ်ပြီး၊ setVersion နှင့် getVersion ကို အသုံးပြုနိုင်ပါသည်။
comment=COMMENT ကွတ်ကီးတွင် မှတ်ချက်များရေးသားရာတွင် အသုံးပြုနိုင်ပါသည်။ သို့ရာတွင် Netscape သတ်မှတ်ချက် ဗားရှင်း ကွတ်ကီးများမှာမူ အသုံးပြုနိုင်မည် မဟုတ်ပါ။ setCommentနှင့် getCommentလုပ်ဆောင်ချက်များကို ပြင်ဆင်ထားပါသည်။
secure HTTPS ကို အသုံးပြုပြီး ဆက်သွယ်ရာတွင် သတ်မှတ်ရန်လိုအပ်ပါသည်။ setSecure နှင့်  getSecure လုပ်ဆောင်ချက် များကို အသုံးပြုနိုင်ပါသည်။


ကျွှန်တော်တို့ ကွတ်ကီး ကိုအသုံးပြုပြီး အသုံးပြုသူနှင့် ဆာဗာကြား၌ အချက်အလက်များကို အပြန်အလှန်အသုံးပြုကြည့်ပါမည်။ အသုံးပြုသူက ဘယ်နှစ်ကြိမ် ဆက်သွယ်ထားသလဲ ဆိုတာကို သိရှိနိုင်တဲ့ နမှုနာကို ရေးကြည့်ပါမည်။

Counter1.java
   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        Cookie ck = null;
        // request မှ ကွတ်ကီးများကို ရယူခြင်း
        Cookie [] cks =  req.getCookies();

        // အသုံးပြုနေသော ကွတ်ကီးကို ရှာဖွေခြင်း
        if (null != cks) {
            for (int i=0; i<cks.length ; i++) {
                if(CK_NAME.equals(cks[i].getName())) {
                    ck = cks[i];
                }
            }
        }
        
        // အသုံးပြုနေသော ကွတ်ကီးကို ရှာမရခဲ့ပါက
        if(null == ck) {
            ck = new Cookie(CK_NAME, "0");
        }
        
        // ကွတ်ကီးမှ တန်ဖိုးကို ရယူ၍ တစ်ပေါင်းခြင်း
        int count = Integer.parseInt(ck.getValue()) + 1;
        // တစ်ပေါင်းထားသော ကွတ်ကီး၏တန်ဖိုးကို ပြန်လည် သတ်မှတ်ခြင်း
        ck.setValue(String.valueOf(count));
        resp.addCookie( ck);
        

        // response တွင် ယူနီကုဒ် Encoding အဖြစ် သတ်မှတ်ခြင်း
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println(getHeaderHtml(EPISODE, "ကွတ်ကီးကို အသုံးပြုခြင်း"));
        writer.print("သင်သည် ဤစာမျက်နှာသို့ " + String.valueOf(count) + "ကြိမ် လာရောက်ခဲ့ပါသည်");        
        writer.println(getFooterHtml());
    }

အထက်ပါ ကုဒ်များဖြင့် ကွတ်ကီးကို အသုံးပြု၍ Access Counter တစ်ခုကို တည်ဆောက်ထားခြင်းဖြစ်ပါသည်။ လက်ရှိ Application မှ အသုံးပြု နိုင်သော ကွတ်ကီးများကို HttpServletRequest#getCookies လုပ်ဆောင်ချက်ဖြင့် ရယူနိုင်ပါသည်။ ရရှိထားသော ကွတ်ကီးများထဲမှ၊ ဤပရိုဂရမ်ဖြင့် ပြုလုပ်ထားသော ကွတ်ကီး၏အမည်နှင့်တူသော ကွတ်ကီးကို for ဝါကျကို အသုံးပြု၍ တစ်ခုချင်း ရှာဖွေပါသည်။ အမည်တူ ကွတ်ကီးကို ရှာဖွေတွေ့ရှိပါက ဤပရိုဂရမ်အတွင်းတွင် အသုံးပြုရန်ကွတ်ကီး နေရာတွင် အစားထိုးလိုက်ပါသည်။

ကွတ်ကီးကိုရှာဖွေမတွေ့ရှိခဲ့ပါက new Cookie(CK_NAME, "0") ဟု တန်ဖိုး "0" ရှိသော ကွတ်ကီးတစ်ခုကို ပြုလုပ်၍ အသုံးပြုမည့်ကွတ်ကီး နေရာတွင် အစားထိုးပါသည်။ ကျန်သော သတ်မှတ်ချက်များကို မရေးသားထားပါသောကြောင့် Default အတိုင်း သတ်မှတ်သွားမည်ဖြစ်သည်။ သက်တမ်းသည်လည်း Web Browser မပိတ်မချင်း အသုံးပြုနိုင်မည် ဖြစ်သည်။

Access Count အဖြစ်အသုံးပြုရန် ကွတ်ကီး၏ တန်ဖိုးကို Cookie#getValue ဖြင့် ရယူပြီး၊ Integer အဖြစ်ပုံစံပြောင်းပြီး တစ်ပေါင်းပါသည်။ အကယ်၍ အသစ်ပြုလုပ်ထားသော ကွတ်ကီးဖြစ်ပါက တန်ဖိုးမှာ "0" ဖြစ်မည်ဖြစ်၍၊ တစ်ပေါင်းပြီးသောအခါ တစ်ကြိမ်မြောက် ဆက်သွယ်ခြင်းဖြစ်ပါမည်။ ပြီးပါက တစ်ပေါင်းထားသောတန်ဖိုးကို Cookie#setValue ကို အသုံးပြု၍ ကွတ်ကီး၏တန်ဖိုးအဖြစ် ပြောင်းလည်းသတ်မှတ်လိုက်ပါသည်။ နောက်ဆုံးတွင် ပြုပြင်ပြီးကွတ်ကီးအား HttpServletResponse#addCookie ဖြင့်၊ Web Browser ထံပြန်ပို့မည့် Response တွင် ဖြည့်စွက် လိုက်ပါသည်။

ကျန်သောအပိုင်းများသည် HTML စာသားများကို ရေးသားနေခြင်းသာဖြစ်ပါသည်။ ဤနေရာတွင် getHeaerHtml နှင့် getFooterHtml သည် အခြားသော Class များတွင်လည်း အလားတူ အသုံးပြုလိုပါသောကြောင့် ၏ Static လုပ်ဆောင်ချက်များအဖြစ် ခွဲထုတ်ထားခြင်း ဖြစ်ပါသည်။ Java SE 5 မှစ၍ static တန်ဖိုးနှင့် လုပ်ဆောင်ချက်များကို import လုပ်နိုင်ပါသောကြောင့် class အမည်ကို ရေးသားရန်မလိုပဲ ကိုယ်ပိုင် လုပ်ဆောင်ချက်ကဲ့သို့ ရေးသားနိုင်ခြင်းဖြစ်ပါသည်။ အနည်းဆုံးလိုအပ်သော လုပ်ဆောင်ချက်များမှအပ လုပ်ဆောင်ချက်များကို မရေးသားခြင်းသည် class ၏ ရည်ရွယ်ချက်ကို နားလည်လွယ်စေသောကြောင့် ဤနည်းသည် လုပ်ငန်းခွင်တွင် အသုံးများသော နည်းတစ်မျိုးဖြစ်ပါသည်။

ရေးသားထားသော နမှုနာများကို Easy Servlet တွင် စမ်းသပ်ကြည့်ရှုနိုင်ပါသည်။ ထို့အပြင် Easy Servlet ၏ Source Code များကိုလည်း Easy Servlet Source Site မှ ရယူနိုင်ပါသည်။



ကွတ်ကီးကို အသုံးပြုသော နမှုနာ လင့်ခ်ကို နှိပ်ကြည့်ပါက အောက်ပါအတိုင်း Access လုပ်လာသည့် အကြိမ်ကို ဖော်ပြပေးမည် ဖြစ်သည်။




Session
အထက်ပါ ကွတ်ကီးခေါင်းစဉ်တွင် တွေ့မြင်ခဲ့သည့်အတိုင်း ကွတ်ကီးသည်၊ တစ်ခုနှင့်တစ်ခု ပတ်သက်မှု့မရှိပဲရှိနေခဲ့သော HTTP ပရိုတိုကောတွင် ဆက်သွယ်မှု့ရှိနေကြောင်း အတွေးအခေါ်(Session) ကို အသုံးပြုနိုင်ရန် အထောက်အကူပြုခဲ့သည်။ သို့ရာတွင် Security ပိုင်းဆိုင်ရာ အမြင်မှ၊ အချို့သည် ကွတ်ကီးကို လက်မခံနိုင်အောင် သတ်မှတ်ထားခြင်း၊ ထို့အပြင် အချို့သော Mobile သုံး Browser များတွင် ကွတ်ကီးကို အသုံးပြုနိုင်ခြင်းများရှိကြသည်။ ထိုအခါမျိုးအတွက် အသုံးပြုနိုင်ရန် Servlet သည် Server ဘက်တွင်လည်း Session ကို အသုံးပြုနိုင်ရန် စီမံချက်များကို ပြင်ဆင်ထားပါသည်။



Servlet ဘက်တွင် HttpServletRequest#getSession လုပ်ဆောင်ချက်ကို အသုံးပြုခြင်းအားဖြင့်၊ Session ကို အသုံးပြုနိုင်ပါသည်။ ထိုလုပ်ဆောင်ချက်သည်၊ ပါရာမီတာကို true ဟု ရေးထားပါက လက်ရှိ အသုံးပြုသူနှင့် ဆာဗာ၏ကြားတွင် သုံးလက်စ Session မရှိသေးပါက၊ HttpSession Object ကို အသစ်ပြုလုပ်ပြီး၊ သုံးလက်စ Session ရှိခဲ့ပါက ရှိပြီးသားSession Object ကို ပြန်ပေးမည်ဖြစ်သည်။
HttpSession Object သည် တစ်ခုတည်းသော Session ID ကိုပိုင်ဆိုင်ပြီး၊ Servlet Container မှ Session ID ကို စမ်းစစ်ခြင်းအားဖြင့် HttpSession Object ကို Control လုပ်နိုင်ခြင်းဖြစ်သည်။ Servlet အပေါ်တွင် HttpServlet Object ကို ပြုလုပ်ပြီးသည့်နောက်၊ Client ဆီသို့ Response ပြန်သောအခါတွင် Session ID အားသိမ်းဆည်း ထားစေပါသည်။ Default အားဖြင့်၊ Session ID သည် ကွတ်ကီးနေရာတွင် သိမ်းဆည်းထားလေ့ရှိပြီး၊ ကွတ်ကီးအပြင် အခြားသောနေရာတွင်လည်း သိမ်းဆည်းထားနိုင်ပါသည်။ ကွတ်ကီးအပြင်အခြားသော နေရာတွင် Session ID ကို သိမ်းဆည်းထားနိုင်ပုံကို နောက်ပိုင်းတွင် ဆက်လက်ဖော်ပြထားပါသည်။
Client သည်လည်း Session ကို ပိုင်ဆိုင်ပြီးသည့်နောက်ပိုင်း Request များတွင် Session ID ကို ထည့်သွင်း Request လုပ်ခြင်းအားဖြင့်၊ Client နှင့် Server ကြားတွင် ဆက်သွယ်မှု့ကို ဖြစ်ပွားစေပြီး၊ ယခင် Request များဖြင့် Session အပေါ်တွင် သိမ်းဆည်းထားသော အချက်အလက်များကို ပြန်လည်အသုံးချနိုင်မည် ဖြစ်ပါသည်။ ထို့အတွက် အသုံးချသူက Log in ပြီးသည့်အချိန်မှ စ၍ လုပ်ငန်းဆောင်တာများ ပြီးဆုံးသည့် တိုင်အောင် အဆင့်ဆင့်မှအချက်အလက်များကို ဆက်သွယ်အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။
ဖော်ပြပါအတိုင်း Session သည် Server Memory ပေါ်တွင် တည်ရှိသောကြောင့်၊ တစ်ချိန်ချိန်တွင် အဆုံးသတ်သင့်ပါသည်။ အသုံးမပြုသော Session ကို Server Memory ပေါ်မှ ဖျက်ပစ်နိုင်ရန် HttpSession#invalidate လုပ်ဆောင်ချက်ကို အသုံးပြုနိုင်ပါသည်။ ဤလုပ်ဆောင်ချက်ကို ခေါ်ယူလိုက်ပါက Session ကို ဖျက်ပစ်နိုင်မည်ဖြစ်သည်။ သို့ရာတွင် လူတိုင်းသည် Session ကို ဖျက်ပစ်သော Servlet ကို ခေါ်မည်ဟု မဆိုနိုင်ပေ။ ထို့ကြောင့် အသုံးပြုခြင်းမရှိပဲ အချိန်အတန်ကြာလျှင်သူ့အလိုလို ဖျက်စီးပစ်နိုင်သော စီမံချက်ကို Servlet တွင် ပြင်ဆင်ထားပါသည်။ web.xml တွင် session-timeout ကို သတ်မှတ်ထားပါက ထိုအချိန်အတွင်း အသုံးပြုခြင်းမရှိပါက သူ့အလိုလို ပျက်စီးသွားမည် ဖြစ်သည်။
    <session-config>
        <session-timeout>5</session-timeout>
    </session-config>
Session နှင့် Cookie ၏ ကွာခြားချက်များကို သိရှိနှင်စေရန် အထက်ပါ ကွတ်ကီးတွင်အသုံးပြုခဲ့သော နမှုနာကိုပဲ Session ကို အသုံးပြု၍ ရေးသားကြည့်ပါဦးမည်။

Counter2.java
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        // Session ကို ခေါ်ယူခြင်း
        HttpSession session = req.getSession(true);
        // Session မှ တန်ဖိုးကို ရယူခြင်း
        String _count = (String) session.getAttribute(COUNR);
        int count = 0;

        if(null !=  _count)
            count = Integer.parseInt(_count);

        // တစ်ပေါင်းခြင်း
        ++count;
        
        // တစ်ပေါင်းထားသော တန်ဖိုးကို Session တွင် သိမ်းဆည်းထားခြင်း
        session.setAttribute(COUNR, String.valueOf(count));
        
        // response တွင် ယူနီကုဒ် Encoding အဖြစ် သတ်မှတ်ခြင်း
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println(getHeaderHtml(EPISODE, "Session ကို အသုံးပြုခြင်း"));
        writer.print("သင်သည် ဤစာမျက်နှာသို့ " + String.valueOf(count) + "ကြိမ် လာရောက်ခဲ့ပါသည်");        
        writer.println(getFooterHtml());
    }
အထက်ပါ doGet လုပ်ဆောင်ချက်သည် အချက်အလက်ကို Session အတွင်းမှ ထုတ်ယူ၊ သိမ်းဆည်းနေခြင်း မှလွဲ၍ အခြားသော နေရာများသည် Counter1.java နှင့် အတူတူပင်ဖြစ်သည်။ ဦးစွာ HttpServletRequest#getSession ဖြင့် HttpSession ၏ Object ကို ရယူပါသည်။ တဖန် COUNTER အမည်ဖြင့် သိမ်းဆည်းထားသော အချက်အလက်ကို HttpSession#getAttribute ကို အသုံးပြု၍ရယူနေသည်။ အကယ်၍ ပဋ္ဌမအကြိမ်ဖြစ်ပါက တန်ဖိုးကို ရရှိမည်မဟုတ်သောကြောင့် count ကို 0 ဟုသတ်မှတ်ထား ခြင်းဖြစ်သည်။ တဖန် ရရှိလာသော တန်ဖိုးသည် null မဟုတ်ပါက Integer တန်ဖိုးအဖြစ်ပြောင်းပြီး count တွင် အစားထိုးပါသည်။
လက်ရှိအကြိမ်ကို သတ်မှတ်ရန်အတွက် count ကို တစ်ပေါင်း၍ HttpSession#setAttribute ကို သုံးပြီး Session တွင် သိမ်းဆည်းစေပါသည်။ ဤသို့ပြုလုပ်ခြင်းအားဖြင့် နောက်တစ်ကြိမ် Session Object မှ သိမ်းဆည်းထားသော အချက်အလက်များကို အသုံးပြုနိုင်ခြင်း
 ဖြစ်သည်။ HttpSession သည်လည်း လိုအပ်သောတန်ဖိုးများကို အမည်နှင့်တွဲ၍ သိမ်းဆည်းထားနိုင်ခြင်း၊ အမည်ဖြင့် သိမ်းဆည်းထားသည့် အချက်အလက်၏တန်ဖိုးများကို ရယူနိုင်ခြင်း တို့ကြောင့်၊ Java ၏ Map သို့မဟုတ် Table အစရှိသည့် Interface များနှင့် ခပ်ဆင်ဆင်ဖြစ်ပါသည်။ ကျန်သော အပိုင်းသည် HTML စာသားများကို ရေးသားနေခြင်းသာဖြစ်ပါသည်။
HttpServlet ၏ အသုံးများသော လုပ်ဆောင်ချက်များမှာ အောက်ပါအတိုင်းဖြစ်ကြသည်။

လုပ်ဆောင်ချက် ရှင်းလင်းချက်
getAttribute ပါရာမီတာ ၏အမည်ဖြင့် Session တွင် သိမ်းဆည်းထားသော တန်ဖိုးကို ရယူနိုင်ပါသည်။
getAttributeNames Session တွင် သိမ်းဆည်းထားသော ပါရာမီတာ ၏အမည်များကို ရယူနိုင်ပါသည်။
getCreationTime Session ကို ပြုလုပ်ထားသည့် အချိန်ကိုရယူနိုင်ပါသည်။
getId Session ID ကို ရယူနိုင်ပါသည်။
getLasAccessedTime Session အား နောက်ဆုံးဆက်သွယ်ထားသော အချိန်ကို ရယူနိုင်ပါသည်။
getInactiveInterval Session ကို ဆက်သွယ်ခြင်းမပြုပဲ သိမ်းဆည်းနိုင်သော ကာလ၏ တန်ဖိုးကို ရယူနိုင်ပါသည်။
getServletContext ထို Session နှင့် ပတ်သက်မှု့ရှိသော ServletContext ကို ရယူနိုင်ပါသည်။
invalidate Session အား ပြီးဆုံးစေနိုင်သော လုပ်ဆောင်ချက် ဖြစ်သည်။ Invalidate လုပ်ထားသော Session Object အားဆက်သွယ် အသုံးချ နိုင်မည် မဟုတ်ပေ။
isNew Session သည် အသစ်ပြုလုပ်ထားသော Session ဖြစ်သလား ဟု သိရှိနိုင်သော လုပ်ဆောင်ချက်ဖြစ်ပါသည်။ Session အသစ်ဖြစ်ပါက true ဟုပြန်ရပြီး၊ အသစ်မဟုတ်ပါက false ဟု ပြန်ရမည်ဖြစ်သည်။
removeAttribute Session တွင် သိမ်းဆည်းထားသော ပါရာမီတာကို ဖျက်ပစ်နိုင်သော လုပ်ဆောင်ချက်ဖြစ်ပါသည်။
setAttribute ပါရာမီတာ၏ အမည်နှင့် တန်ဖိုးကို Session Object တွင် သိမ်းဆည်းရာတွင် အသုံးပြုသော လုပ်ဆောင်ချက် ဖြစ်ပါသည်။

 Tomcat နဲ့ Glassfish ကို အသုံးပြုပြီးရေးပါက Session ကို အသုံးပြုရန် အထွေအထူး ဘာမှမလိုပေမဲ့၊ Google App Engine (jetty) ကို အသုံးပြုသည့်အခါ appengine-web.xml တွင် အောက်ပါအတိုင်း ဖြည့်စွက် ရေးသားရန်လိုအပ်ပါသည်။
<sessions-enabled>true</sessions-enabled>

အထက်ပါ နမှုနာကိုလည်း Easy Servlet တွင် စမ်းသပ်ကြည့်ရှုနိုင်ပါသည်။



ကွတ်ကီးကို လုံးဝအသုံးမပြုသော Session
အထက်ပါတွင် ဖော်ပြခဲ့သည့်အတိုင်း Session ID သည် Default အတိုင်းဆိုပါက၊ Cookie တွင် ရေးသား၍ Client နှင့် Server အကြားတွင် အဆက်အသွယ်ပြုလုပ်နေပါသည်။ သို့ရာတွင် Security အနေအထားအရ Browser တွင် Cookie ကို လက်မခံပါဟု သတ်မှတ်ထားသည့်အခါမျိုး၊ ဒါမှမဟုတ် Mobile များ၏ အချို့သော Browser များတွင် Cookie ကို Support မလုပ်သည့် အခါများတွင်Cookie ကို သုံးမရသည့် အခါမျိုးလည်း ရှိတတ်ပါသည်။
ထိုကဲ့သို့အခါများအတွက် Servlet တွင် အခြားသောနည်းလမ်းမျိုးကို ပြင်ဆင်ထားပါသည်။ နောက်ပိုင်း Session အဖြစ်အသုံးပြုလိုသည့် URL များတွင် Session ID ကို ဖြည့်စွက်ရေးသားသော နည်းဖြစ်ပါသည်။ HttpServletResponse#encodeURL လုပ်ဆောင်ချက်ကို အသုံးပြုပါက URL ၏အနောက်တွင် အလိုအလျှောက် Session ID ကို ဖြည့်စွက်ရေးသားပြီး ဖြစ်ပေမည်။

Counter3.java
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        // Session ကို ခေါ်ယူခြင်း
        HttpSession session = req.getSession(true);
        // Session မှ တန်ဖိုးကို ရယူခြင်း
        String _count = (String) session.getAttribute(COUNR);
        int count = 0;

        if(null !=  _count)
            count = Integer.parseInt(_count);

        // တစ်ပေါင်းခြင်း
        ++count;
        
        // တစ်ပေါင်းထားသော တန်ဖိုးကို Session တွင် သိမ်းဆည်းထားခြင်း
        session.setAttribute(COUNR, String.valueOf(count));
        
        // response တွင် ယူနီကုဒ် Encoding အဖြစ် သတ်မှတ်ခြင်း
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        writer.println(getHeaderHtml(EPISODE, "Session ကို အသုံးပြုခြင်း"));
        writer.print("သင်သည် ဤစာမျက်နှာသို့ " + String.valueOf(count) + "ကြိမ် လာရောက်ခဲ့ပါသည်။<br /><br />");
        writer.print("<a href='" + resp.encodeURL("/SessionCtr2") + "' >ကွတ်ကီးမသုံးပဲ ဆက်သွယ်ကြည့်ခြင်း</a>");
        writer.println(getFooterHtml());
    }
အတော်များများမှာ Counter2.java နှင့် အတူတူပင်ဖြစ်သည်။ ကွယ်ပြားခြားနားသည်မှာ အောက်ဆုံးမှစ၍ တတိယမြောက်စာကြောင်းဖြစ်ပါသည်။ Counter3.java ကို ခေါ်သော လင့်ခ်တစ်ခုကို ရေးသားထားပြီး URL အား HttpServletResponse#encodeURL ဖြင့် Session ID ကို ဖြည့်စွက် ရေးသားနေခြင်းဖြစ်ပါသည်။ ဤကဲ့သို့ရေးသားခြင်း အားဖြင့် ကွတ်ကီးကိုလက်မခံသည့် အခါမျိုးတွင်လည်း Session ကို အသုံးပြုနိုင်မည်ဖြစ်ပါသည်။
မှတ်ချက်။  ။ နမှုနာများကို Easy Servlet တွင် လက်တွေ့စမ်းသပ်နိုင်ပါသည်။
ဦးစွာ Browser တွင် ကွတ်ကီးကို အသုံးမပြုပါဟု အောက်ပါအတိုင်း သတ်မှတ်ပါမည်။


အောက်ပါအတိုင်း Tutorials > Episode 3 မှ ကွတ်ကီးနှင့်ဆက်ရှင် နမှုနာကို သွားပါမည်။


ပြီးပါက 3. Session ကို သာအသုံးပြုထားသော နမှုနာလင့်ခ်ကို နှိပ်ကြည့်ပါမည်။ အောက်ပါအတိုင်း တစ်ကြိမ် ဟုဖော်ပြနိုင်မည်ဖြစ်သည်။


တဖန် ကွတ်ကီးမသုံးပဲ ဆက်သွယ်ကြည့်ခြင်း လင့်ခ်ကိုနှိပ်ကြည့်ပါမည်။


အထက်ပါအတိုင်း နှစ်ကြိမ်ဖြစ်ကြောင်းဖော်ပြနိုင်သည်ကို တွေ့ရမည်ဖြစ်ပါသည်။ ကွတ်ကီးကိုလက်မခံဟု သတ်မှတ်ထားသော်လည်း Session ကို ကောင်းစွာ အသုံးပြုနိုင်ကြောင်းကို သိရှိနိုင်ပါသည်။
Session နှင့် Cookie သည် Server Side Programming အတွက် မသိမဖြစ်လိုအပ်သော နည်းပညာဖြစ်ပါသည်။ Servlet Container ဘက်တွင် ဤကဲ့သို့ Session နှင့် Cookie ကို Control လုပ်နိုင်ကြောင်း၊ Session နှင့် Cookie ၏Life Cycle နှင့် သဘောသဘာဝကို သိရှိထားသင့်ပါသည်။ လက်တွေ့ လုပ်ငန်းခွင်တွင် Java EE ကို အသုံးပြု၍ Server Side Application ကို ရေးပါက ဤ Session နှင့် Cookie ကို မဖြစ်မနေ အသုံးပြုရတတ်သောကြောင့်ဖြစ်ပါသည်။

ဤအခန်းတွင် ရေးသားထားသော Source Code များကို Easy Servlet Source တွင် ရယူနိုင်ပါသည်။

ကိုးကား
http://legacy.techscore.com/tech/J2EE/Servlet/4.html
http://www.servlets.com/jservlet2/
http://www.oracle.com/technetwork/java/javaee/servlet/index.html

လေးစားစွာဖြင့်
မင်းလွင်

No comments:

Post a Comment