PracticU

תרגיל 24 - תוכנת צ'אט - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס ג'אווה סקריפט מעשי - JavaScript › תרגיל 24 - תוכנת צ'אט - חלק 2
מילון מושגים:
עוגייה - קובץ קטן שאתר שומר בדפדפן כדי לזכור מידע על המשתמש בין בקשות, למשל מצב התחברות או העדפות.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
בקשה - פנייה שלקוח שולח לשרת כדי לקבל מידע או לבצע פעולה. השרת מחזיר עליה תגובה.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
תגובה - המידע שהשרת מחזיר ללקוח בתשובה לבקשה, הכולל בדרך כלל נתונים וקוד סטטוס.

תרגיל 24 - תוכנת צ'אט - חלק 2
בהמשך לבניית הצ'אט, ההרצאה מוסיפה זיהוי משתמש בעזרת קוקי, שליפת היסטוריית השיחות של המשתמש והצגתה בדף עם הבחנה בין הודעות המפעיל להודעות הלקוח.
השלבים העיקריים
1. קוקי כזיהוי לאורך זמן: שרת HTTP הוא חסר מצב (stateless), ולכן השרת שולח קוקי עם מזהה אקראי שתוקפו 90 יום. בכל בקשה הדפדפן מחזיר את הקוקי לשרת.
2. משתמש קיים או חדש: אם הבקשה מגיעה עם קוקי, לוקחים ממנו את הערך. אם אין קוקי, מגרילים מספר בין 10,000 ל-100,000 ומתייחסים למשתמש כחדש.
3. מזהה מהקוקי ולא מההודעה: ההודעה ששולח הלקוח כוללת שדה של מזהה משתמש, אבל השרת מחליף אותו במזהה מהקוקי, כי הקוקי נשמר גם אחרי סגירת הדפדפן.
4. הוספת הקוקי לתשובה: בתשובה נוספת כותרת Set-Cookie עם שם המזהה, תאריך התפוגה והנתיב של השורש.
5. שליפה וסיריאליזציה: השרת שולף את כל ההודעות של המזהה הנוכחי (where) ומהפך אותן לטקסט JSON. לקוח מקבל מערך של אובייקטים.
6. חותמת זמן בשרת: השעה של ההודעה נקבעת בשרת ולא בלקוח, כדי שלא יהיה אפשר לזייף אותה.
7. פענוח בצד הלקוח: JSON.parse מהפך את הטקסט למערך של אובייקטים, שאיתם קל לעבוד.
8. הצגה בלולאה: כל הודעה מוצגת בתיבת ההיסטוריה עם תאריך. הודעות המפעיל מוצגות בכחול והודעות המשתמש בשחור.
טעויות נפוצות
המרצה מזהיר שסוגר או גרש שחסר בקוד הג'אווה סקריפט עלול לגרום לכך שההודעה לא תוצג, בלי שום הודעת שגיאה ברורה. לכן כדאי לבדוק את הקונסול ואת הטוען.
פקודות והגדרות
הדפדפן מראה את ה-Request Headers וה-Response Headers בלשונית Network. כך אפשר לראות איזה קוקי נשלח בבקשה ואיזה קוקי חזר מהשרת.
ההרצאה מסתיימת בכך שהצ'אט כבר שומר ושולף היסטוריה לפי משתמש, ושבעתיד ישופר העיצוב.

פרקי ההרצאה: תרגיל 24 - תוכנת צ'אט - חלק 2

  1. 00:00

    מבוא: שליחת הודעות צ'אט עם AJAX

  2. 01:04

    קוקי: מזהה משתמש שנשמר אצל הלקוח

  3. 02:23

    HTTP חסר זיכרון והצורך בקוקי

  4. 06:10

    הקצאת קוקי לתשעים יום

  5. 06:49

    קריאת הקוקי מהבקשה לשרת

  6. 09:44

    בדיקה אם הלקוח כבר קיים

  7. 11:47

    שימוש במזהה מהקוקי ולא מההודעה

  8. 13:48

    יצירת מזהה אקראי למשתמש חדש

תמלול ההרצאה: תרגיל 24 - תוכנת צ'אט - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «תרגיל 24 - תוכנת צ'אט - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אנחנו ממשיכים לעשות את הצ'אט שלנו ובואו נראה מה עשינו עד עכשיו ויש לנו את הממשק הגרפי של הצ'אט שיש לנו מקום לכתוב היסטוריה כאילו כל ההיסטוריה של ההודעות ומקום להודעה חדשה וכפתור של לשלוח את זה לשרת אנחנו ממשיכים לבנות את הצ'אט כשאנחנו לוחצים send הדף בעצם לא קורה לו כלום הוא נשאר במקום לא מתרפרש וזה שולח עם אג'קס לשרת,

  2. 00:39

    והשרת שומר את המידע בתוך הדאטאבייס. בואו נראה, הנה יש לנו כרגע בדאטאבייס את ההודעות האלו, שימו לב, יש לנו מזהה של יוזר, יש לנו יוזר איי-די, יש לנו יוזר מספר 111 ו-222.

  3. 00:55

    היוזר איי-די זה מזהה של יוזר שאנחנו הולכים לייצר משהו אקראי לכל משתמש חדש שנכנס, וזה יישמר כקוקי. קוקי זה משהו שאנחנו נותנים ליוזר. כשאנחנו מקבלים בקשה מהיוזר, מחזירים לו קוקי, והקוקי הזה, יוזר מביא לנו חזרה כשהוא נכנס לדף עוד פעם.

  4. 01:25

    קוקי זה כמו כרטיס כזה, שכששילמת בקופה אתה מקבל כרטיס, ועם הכרטיס אתה יכול ללכת לדלת אחרת ולהיכנס לאנשהו. זאת אומרת שקוקי נשמר אצל היוזר.

  5. 01:43

    כמו שאתם רואים, יש לי פה קוקי ממשהו אחר שעשיתי שזה שפה שהיוזר בחר נניח רוסית השפה של האתר אינטרנט כשאתה בוחר זה באתר שיש לו הרבה שפות אז קוקי נשמר מקומית בתוך הדפדפן וכשיוזר גולש עוד פעם לאתר

  6. 02:06

    הוא מביא את הקוקי הזה לאתר והאתר יודע מידע לגביו לדוגמה הוא יודע שעברת בדיקה של שם וסיסמה או איזה שפה אתה מעדיף עכשיו מאיפה הקוקי הזה מלכתחילה מגיע?

  7. 02:18

    הוא מגיע מלכתחילה מהשרת. זאת אומרת, השרת נותן לך את הקוקי ואתה מביא לו אותה בחזרה. למה? כי השרת של HTTP עקרונית הוא סטייטלס, כאילו, הוא לא זוכר מי אתה.

  8. 02:33

    הוא טיפל בבקשה שלך ושכח אותך. אז אתה לא רוצה שהוא ישכח אותך, אז כדי לפתור את הבעיה הזאת, בסוף הבקשה, בסוף הטיפול, נותנים איזשהו קוקי, שומרים בדאטאבייס, השרת שומר בדאטאבייס או בזיכרון של השרת עצמו בקשר לו את הקוקי שלך, וכשתבוא עוד פעם הוא יזהה אותך, אוקיי?

  9. 02:59

    כמו חותמת כזאת ששמים על היד למי ששילם כסף. אז הקוקי הזה יש לו תוקף ואנחנו יכולים לקבוע לכמה זמן, ואנחנו יכולים גם למחוק אותו. ברגע שנמחק אותו, אז השרת לא יזהה אותנו.

  10. 03:14

    משתמשים בקוקי הזה לדוגמה בעימות של שם וסיסמה. אתה עובר בדיקה של שם וסיסמה, אתה מקבל קוקי. אחרי שקיבלת קוקי, אתה עם הקוקי הזה יכול להיכנס לדפים שמובטחים ובכניסה לדף מובטח בודקים שהקוקי שלך בתוקף והוא תקין.

  11. 03:32

    כך עובדות כל מערכות האבטחה. היתרון של קוקי שגם אם תסגור דפדפן ותפתח אותו, הקוקי יישאר עד שהוא לא יפוג תוקף שנקבע בשרת.

  12. 03:43

    לדוגמה פייסבוק לא מבקשים ממני שם וסיסמה בכניסה לאתר כי הם ביקשו ממני פעם אחת ומאז שמרו את הקוקי ואני נכנס לפייסבוק כל פעם אוטומט. למה אוטומט? כי יש לי את הקוקי שלו.

  13. 04:00

    אם יגנבו לי את הקוקי, אז כאילו גנבו לי את השם והסיסמה. אז לכן גם קוקי נורא חשוב שלא יגנבו אותו. בגלל זה פייסבוק, לדוגמה, בגלל שהם יודעים שיש בעיית אבטחה שאפשר לגנוב את הקוקי, כי זה סך הכל קובץ טקסט בהרדיסק, אז כשאתה משנה איזה שהם פרטים בחשבון שלך, כמו כתובת מייל,

  14. 04:23

    הם מבקשים שתכניס את הסיסמה. הם לא סומכים על זה שיש לך את הקוקי. אז קוקי זה משהו נוח ששרת שולח לקליינט והקליינט שומר אצלו עד לתאריך מסוים או עד סוף הסשן, סשן זה חלונית שפתוחה, ומביא חזרה לשרת את הקוקי הזה וככה שרת יודע שאתה זה אתה, או מה העדפות שלך, או כל מיני דברים כאלו.

  15. 04:52

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

  16. 05:19

    כך עובד שרת ה-Web ובשביל לפתור את הבעיה הזאת ימצאו אותו קוקי. למעשה יש עוד דברים אחרים אבל אנחנו לא ניכנס אליהם.

  17. 05:32

    אני מדבר על זה שב-HTML 5 הופיע גם Local Storage, אחסון מקומי, ההבדל בין לוקל סטורג' לקוקי שקוקי תמיד תמיד אוטומט נשלח לשרת לפי הדומיין, לפי שם האתר, קוקי אוטומט נשלח, דפדפן תמיד תמיד שולח את הקוקי לשרת שממנו זה הגיע.

  18. 05:56

    וזה כמו דאטאבייס כזה קטן מקומי, ויש דאטאבייס אמיתי וגדול שנקרא לוקל סטורג' שזה ב-HTML 5 הופיע. אוקיי, אנחנו עכשיו רוצים, מה לעשות? אנחנו רוצים לעשות ליוזר חדש שהגיע, לייצר לו קוקי ומספר אקראי לשמור את זה בדאטה בייס ולפי הקוקי הזה לשלוף את ההיסטוריה שלו ואם בן אדם במשך 90 יום עוד פעם נכנס לצ'אט שלנו אנחנו ממשיכים שיחה מאותה נקודה

  19. 06:31

    רוצים לתת לו קוקי ל-90 יום בואו נעשה את זה אז מה אנחנו עושים אנחנו בעצם מתחילים מזה שאנחנו בודקים האם הבקשה של היוזר יהיה עם קוקי או בלי קוקי אם זה הגיע עם קוקי אז אנחנו שולפים משם את היוזר איי-די שלו את המספר המזהה שלו אם לא אנחנו מייצרים לו מספר אקראי מזהה אקראי אז בואו נתחיל כדי לעבוד עם קוקי יש מחלקה מוכנה קלאס

  20. 07:05

    מוכן מחלקה מוכנה שיודעת לטפל בקוקי שנקראת קוקי הדר קוקי הדר ו-values זה המחלקה והיא נמצאת בתוך הניימספייס שנקרא system.net.http.headers הניימספייס למעשה זה קיבוץ ביחד קבוצה של מחלקות זאת אומרת יש לנו הרבה מאוד מחלקות הרבה מאוד מחלקות שמהם אנחנו מייצרים אובייקטים

  21. 07:38

    אנחנו צריכים לכווץ אותם ביחד לניימספייסים לקבוצות לדוגמה המחלקה שלי היא בתוך ניימספייס שנקרא chat.controllers בגלל שיש כל כך הרבה אובייקטים כדי שהם גם השמות לא יחזרו על עצמם לא יהיה לנו כפל של שמות וגם יהיה לנו נוח לזהות אותם לכל כל אובייקט יש לו כמו משפחה שאליה הוא שייך

  22. 08:05

    המשפחה הזאת, הקבוצה הזאת, זה השם המלא שלו, ואתם יכולים לראות שאנחנו יכולים לכתוב את השם המלא שלו, כולל ה-Namespace.

  23. 08:16

    אבל במקום לכתוב את זה כל פעם ככה ארוך ידנית, שם משפחה של האובייקט הזה, את ה-Namespace שלו, אנחנו עושים למעלה Using.

  24. 08:27

    יפה. וברגע שיש לנו את ה-Using, אנחנו יכולים להשתמש רק בשם המקוצר של המחלקה. עכשיו, מהמחלקה אפשר לבנות אובייקטים בזיכרון, ואם יש לו משהו סטטי בתוך המחלקה אפשר ישירות להשתמש בזה.

  25. 08:46

    אנחנו נעשה אובייקט שנקרא קוקי ונעשה מופע בזיכרון של המחלקה הזאת. ניצור את האובייקט הזה וניקח את הערך שלו ישירות מתוך הבקשה שהגיעה לשרת. יש אובייקט שנקרא request והוא מכיל את הבקשה שהגיעה לשרת ובפנים יש header הכותרת ויש את ה-content, את התוכן.

  26. 09:19

    לוקחים מתוך הכותרות את הקוקי'ס ומתוך הקוקי'ס לוקחים את הקוקי'ס המזהה שלנו ואם יש כמה ניקח רק את הקוקי'ס הראשונה בלבד אוקיי אז למעשה יצרנו עכשיו אובייקט בזיכרון משתנה שקוראים לו קוקי'ס ויש שם בפנים את הקוקי'ס שהוגיע מתוך הבקשה שהגיעה לשרת מתוך הרקווסט שהגיע לשרת עכשיו צריך לבדוק האם זה באמת קיים כי אם

  27. 09:52

    זה קיים זה משתמש קיים ואם אם זה לא קיים זה משתמש חדש יכול להיות שהיא בכלל אין שמה קוקי אין קוקי רק למי שפעם ראשונה נכנס לצ'אט שלנו אז אנחנו בודקים האם קוקי הוא נעל או לא נעל האם הוא קיים או שהוא לא קיים סימן קריאה שווה זה אומר לא נעל לא נעל זה אומר שהוא קיים ושווה שווה נעל זה אומר שהוא לא קיים יפה אנחנו אומרים שהוא לא נעל מה זה אומר לא נעל זה אומר שהקוקי אכן קיים

  28. 10:29

    ואם הוא אכן קיים זה יוזר שכבר היה אצלנו בדאטאבייס היה לפני כן. אנחנו כותבים Existing Client ואם הוא לא היה כותבים New Client, New User.

  29. 10:44

    כשיהיה לנו משתמש חדש אנחנו ניצור לו מזהה חדש, קוקי חדש, נשמור אותו בדאטאבייס ונשלח לו, תכף נעשה את הכל. טוב, בואו נתחיל.

  30. 11:00

    אנחנו נעשה עכשיו משתנה שנקרא Current User, User הנוכחי וה-ID שלנו זה יהיה String, זה יהיה טקסט וה-current user ID הזה ניקח אותו או מתוך קוקי אם זה משתמש קיים.

  31. 11:21

    זה אומר שאנחנו הולכים לתוך הקוקי ולוקחים את ה-value שלו, את הערך שלו. מה זה ה-value? יש את השם ויש את ה-value, את הערך. אז אנחנו לוקחים מתוך העמודה את ה-value.

  32. 11:41

    יופי, לקחנו, זה לי מקרה שזה משתמש קיים. ומה צריך עכשיו לעשות? עכשיו צריך להכניס את זה לתוך ההודעה, לתוך המסג'. למעשה בתוך ההודעה שהגיעה מהקליינט כבר יש לנו את ה-user ID ואנחנו לא רוצים את ה-user ID שיגיע בתוך ההודעה, אנחנו רוצים שהוא יגיע מתוך ה-cookie.

  33. 12:06

    למה? כי ההודעה הזאת וכל הערכים שלה נמחקים ברגע שאתה סוגר את החלונית, את הדפדפן. רק ה-cookie נשמר. אז בגלל שה-cookie נשמר וכל שאר המידע הולך לאיבוד, אנחנו רוצים שה-user ID יישמר ולכן אנחנו ניקח אותו לא מתוך ההודעה, שנשלחת אלא מתוך הקוקי אז בואו נגזור את זה ונלך לשרת ונגיד שההודעה שהגיעה הצ'אט מסאג'

  34. 12:39

    הזה זה ההודעה בצ'אט שהגיעה השדה של היוזר איידי יהיה מתוך הקוקי היא מתוך קרנט יוזר איידי יפה מאוד אז למעשה לקחנו הוצאנו מכאן את היוזר איידי והוספנו אותו בחזרה בשרת מתוך הקוקי אנחנו בונים את הצ'אט מסאג' הזה כמו שצריך כי אנחנו הולכים לשמור אותו בדעתנו אם נלחץ F12 על ההודעה, נראה את ההגדרה של הקלאס ונראה מאיזה שדות הקלאס הזה מורכב.

  35. 13:34

    יפה מאוד. אנחנו רוצים להרכיב את האובייקט ChatMessage כמו שצריך, לשמור אותו בדאטאבייס. אתם רואים, אנחנו למטה שומרים אותו בדאטאבייס, ולכן אנחנו מרכיבים אותו כמו שצריך עכשיו.

  36. 13:59

    בואו עכשיו נטפל במשתמש חדש. אם יש לנו משתמש חדש, אנחנו נעשה מספר אקראי. נעשה מספר אקראי קודם כל עושים אובייקט של מספר אקראי ועכשיו אנחנו נשתמש באובייקט הזה בשביל לעשות הגרלה של מספר אקראי נניח בין 10,000 ל-100,000 המספר האקראי הזה זה בעצם המזהה של היוזר ועכשיו צריך את היוזר ה-id החדש הזה שהגרלנו להכניס לתוך ההודעה בגלל שזה אותו דבר כמו ב-if למעלה עשיתי את

  37. 14:45

    זה מחוץ ללולאה מחוץ ל-if כדי לא לכתוב פעמיים אותו קוד אז כתבנו ש-Chat Message

לקורס המלא: קורס ג'אווה סקריפט מעשי

ההרצאה הקודמת: תרגיל 24 - תוכנת צ'אט - חלק 1

הרצאות קשורות מקורסים אחרים

  • פרויקט מעשי ב-#C - תוכנת צייר - חלק 1
  • שכפול מחשב - תוכנת Acronis
  • התקנה אוטומטית של תוכנת 7zip על כל התחנות

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס TypeScript
  • קורס ריאקט - React
  • קורס NodeJS