דף הבית   | מפת האתר   | אודות

 מדריך ללימוד Servlets>מעקב session> session API

הינך נמצא ב :

Servlet API למעקב session
 

השימוש ב-sessions ב-Servlets הינו פשוט וכולל: חיפוש אחר אובייקט session הקשור לבקשה הנוכחית, יצירת אובייקט session חדש, חיפוש מידע הקשור ל-session, אחסון מידע ב-session ושחרור session שהושלם או ננטש, לבסוף צירוף מידע session לכתובת URL המוחזרת ללקוח.

חיפוש אחר אובייקט HttpSession הקשור לבקשה הנוכחית

החיפוש נעשה באמצעות הקריאה ל-getSession method של HttpServletRequest. באופן שקוף למתכנת המערכת מרחיבה את User ID של המשתמש מתוך cookie או נתוני URL מצורפים ומשתמשת בהם כמפתח חיפוש בטבלה המכילה אובייקטי HttpSession שנוצרו קודם לכן. getSession מחזיר null אם המשתמש אינו משתתף יותר ב-session, לכן תוכל ליצור session חדש. יצירת session  חדש היא כה נפוצה שקיימת אפשרות של יצור אוטומטי של session  חדש אם חדל מלהתקיים. כל שיש לעשות הוא להעביר את הערך true ל-getSession.

 

 

HttpSession session = request.getSession(true);

 

ניתן לבדוק אם session  חדש נוצר או שנוצר קודם לכן על ידי isNew method.

 

חיפוש מידע הקשור ל session

אובייקטי HttpSession חיים בשרת ומקושרים אוטומטית ללקוח באמצעות מנגנון מאחורי הקלעים בדומה למנגנון ה-cookies או למנגנון שכתוב URL. אובייקטים אלו הינם מבני נתונים המאפשרים לאחסן מספר כלשהו של מפתחות ערכים.

בגרסה Servlet API 2.1 חיפוש ערך נעשה על ידי

 

 

 session.getValue("attribute");

 

הערך המוחזר הוא מסוג Object ולכן יש לבצע cast בהתאם למידע שאוחסן. null מוחזר אם לא נמצא מפתח זה.

ב- Servlet API 2.2  ה-getAttribute method מועדף על פני getValue.

דוגמא:  נניח ש-Shopping Cart היא מחלקה שהוגדרה לאחסן מידע אודות פריטים שנרכשו:

 

 

 

HttpSession session = request.getSession(true);

ShoppingCart cart = (ShoopingCart) session.getValue("ShoppingCart");

if (cart == null)

 {

      // no cart already in session

      cart = new ShoppingCart();

      session.putValue("ShoppingCart", cart)

}

doSomethingWithCart(cart);

 

ניתן לגלות גם את שמות כל התכונות ב-session על ידי שימוש ב- getValueNames method המחזירה string array. בגירסה 2.2 קיים גם ה- getAttributeNames method המחזיר Enumaration.

אחסון מידע ב-session

אחסון מידע באובייקט session נעשה באופן הבא: ב-Servlet API 2.1 על ידי putValue method  המקבל מפתח וערך. ב-Servlet API 2.2 על ידי setAttribute method. שם זה הוא יותר עקבי מכיוון שהוא משתמש בקידומת get/set של JavaBeans. כדי לאפשר לערכים שלך לבצע פעולות משנה כאשר הם מאוחסנים ב-session כל שעליך לעשות הוא לגרום לאובייקט הקשור ליישם את HttpSessionBindingListener interface. כעת בכל פעם ש- putValue או setAttribute נקראים עבור אחד מהאובייקטים האלה, valueBound נקראת מיד לאחר מכן.

לשם הסרת  מפתח / ערך יש להשתמש ב-removeValue או removeAttribute (בהתאם לגרסת API).

 

ביטול sessions

sesssions יהפכו אוטומטית ללא פעילים כאשר משך הזמן שבין שתי גישות של הלקוח יעבור את מרווח הזמן שצוין באמצעות getMaxInactiveInterval method של HttpSession. כאשר הזמן פג כל אובייקט הקשור ל-HttpSession  משוחרר אוטומטית. כשדבר זה מתרחש האובייקטים המצורפים יוודעו על כך אוטומטית  אם הם מיישמים את ממשק HttpSessionBindingListener. אם אין ברצונך להמתין לפקיעת תוקפם של  sessions ניתן לבטלם במפורש על ידי השימוש ב-invalidate method של HttpSession.

 

פענוח כתובת URL הנשלחות ללקוח

אם הינך משתמש לצורך מעקב sessions בשכתוב URL ושולח כתובת  URL המקשרת את האתר שלך ללקוח, עליך להוסיף במפורש את מידע ה-session. כשלא קיימת תמיכת לקוח ב-cookies ה-Servlet יעבור אוטומטית לתצורת שכתוב URL. עליך לקודד את כל כתובות ה-URL המתייחסות לאתר שלך. קיימים שני מקומות אפשריים בהם תוכל להשתמש בכתובות  URL המתייחסות לאתר. האחד הוא כאשר כתובת ה-URL מוטבעת במסמך הנוצר על ידי ה-Servlet. כתובות URL אלו אמורות להיות מועברות באמצעות encodeURL method של HttpServletResponse. שיטה זו תקבע האם שכתוב ה-URL הנוכחי תקף ותוסיף את מידע ה-session רק אם נחוץ.  אחרת כתובת ה-URL תוחזר ללא שינוי.

 

דוגמא :

 

String originalURL = someRelativeOrAbsoluteURL;

String encodedURL = response.encodeURL(originalURL);

out.println("A HREF = "" +encodedURL + /''>...</A>");

המקום השני בו תוכל להשתמש בכתובת URL המתייחסת לאתר שלך הוא בקריאה ל-sendRedirect (הצבה בכותרת התגובה Location). במקרה זה קיימים כללים שונים כדי לקבוע האם חובה לצרף מידע של  session, לכן אינך יכול להשתמש ב-encodedURL אולם HttpServletResponse  מספקת את encodeRedirectURL כדי לטפל במקרה זה.

לדוגמא :

 

String originalURL = someURL; // relative URL ok in version2.2

String encodedURL = response.encodeRedirectURL(originalURL);

response.sendRedirect(encodedURL);

מכיוון שלעתים אינך יודע האם ה-Servlet שלך ייהפך מאוחר יותר לחלק מסדרת דפים המשתמשים במעקב sessions, עדיף ש-Servlets יתוכננו מראש ויקדדו כתובות URL המתייחסות לאתר שלהם.




       
  כל הזכויות שמורות למערכות מידע אית"ן