השימוש ב-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 המתייחסות לאתר שלהם.
|