שינוי פרמטרים של דגם קפיץ עם מיירט המטפל

1. הקדמה

במדריך זה אנו מתמקדים ב- MVC באביב HandlerInterceptor. באופן ספציפי יותר, נשנה את פרמטרי המודל של Spring MVC לפני ואחרי הטיפול בבקשה.

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

2. תלות Maven

על מנת להשתמש מיירטים, עליך לכלול את החלק הבא בא תלות החלק שלך pom.xml קוֹבֶץ:

 org.springframework spring-web 5.2.8.RELEASE 

הגרסה האחרונה תוכל למצוא כאן.

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

3. יישום מותאם אישית

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

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

נתחיל עם הגדרת החדש שלנו מיירט מעמד:

מחלקה ציבורית UserInterceptor מרחיבה את HandlerInterceptorAdapter {יומן לוגר סטטי פרטי = LoggerFactory.getLogger (UserInterceptor.class); ...}

אנו מאריכים HandlerInterceptorAdapter, כמו שאנחנו רק רוצים ליישם preHandle () ו postHandle () שיטות.

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

ציבורי בוליאני סטטי ציבורי isUserLogged () {נסה {return! SecurityContextHolder.getContext (). getAuthentication () .getName (). שווה ("anonymousUser"); } לתפוס (חריג ה) {להחזיר כוזב; }}

כאשר an HttpSession הוקמה, אך איש אינו מחובר, שם משתמש בהקשר של אבטחת אביב שווה ל- משתמש אנונימי. לאחר מכן, אנו ממשיכים ביישום preHandle ():

3.1. שיטה preHandle ()

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

@Override preHandle בוליאני ציבורי (HttpServletRequest בקשה, HttpServletResponse תגובה, אובייקט אובייקט) זורק חריג {if (isUserLogged ()) {addToModelUserDetails (request.getSession ()); } להחזיר נכון; }

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

ריק ריק addToModelUserDetails (הפעלת HttpSession) {log.info ("================ addToModelUserDetails ======================= ==== "); מחרוזת LoginUsername = SecurityContextHolder.getContext (). GetAuthentication (). GetName (); session.setAttribute ("שם משתמש", שם משתמש מחובר); log.info ("משתמש (" + מחובר שם משתמש + "):" + מושב); log.info ("================ addToModelUserDetails ============================"); }

השתמשנו SecurityContextHolder להשיג שם משתמש מחובר. אתה עלול לבטל את אבטחת האביב פרטי המשתמש יישום לקבלת דוא"ל במקום שם משתמש רגיל.

3.2. שיטה עמ 'ostHandle ()

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

@Override public void voHandle (HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView model) זורק חריג {if (model! = Null &&! IsRedirectView (model)) {if (isUserLogged ()) {addToModelUserDetails (model); }}}

בואו נסתכל על פרטי היישום.

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

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

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

בוליאני סטטי ציבורי isRedirectView (ModelAndView mv) {מחרוזת viewName = mv.getViewName (); אם (viewName.startsWith ("redirect: /")) {return true; } תצוגת תצוגה = mv.getView (); return (view! = null && view instance of SmartView && ((תצוגת SmartView)) .isRedirectView ()); }

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

ריק ריק addToModelUserDetails (דגם ModelAndView) {log.info ("================ addToModelUserDetails ======================= ==== "); מחרוזת LoginUsername = SecurityContextHolder.getContext () .getAuthentication (). GetName (); model.addObject ("שם משתמש מחובר", שם משתמש מחובר); log.trace ("session:" + model.getModel ()); log.info ("================ addToModelUserDetails ============================"); }

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

4. תצורה

כדי להוסיף את החדש שנוצר מיירט בתצורת האביב, עלינו לעקוף addInterceptors () שיטה בפנים WebConfig כיתה שמיישמת WebMvcConfigurer:

@Override ריקים ציבוריים addInterceptors (InterceptorRegistry registry) {registry.addInterceptor (UserInterceptor חדש ()); }

אנו עשויים להשיג את אותה תצורה על ידי עריכת קובץ התצורה של XML Spring שלנו:

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

שימו לב, אם מרובה האביב מיירטים מוגדרים, ה- preHandle () השיטה מתבצעת לפי סדר התצורה ואילו postHandle () ו afterCompletion () שיטות מופעלות בסדר הפוך.

5. מסקנה

הדרכה זו מציגה בקשות יירוט באינטרנט באמצעות ה- HandlerInterceptor של Spring MVC על מנת לספק מידע על המשתמש.

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

כל הדוגמאות והתצורות זמינות כאן ב- GitHub.

5.1. מאמרים בסדרה

כל מאמרי הסדרה:

  • מבוא למיירטים של מטפלים באביב
  • שינוי פרמטרים של דגם קפיץ עם מיירט המטפל (זה)

$config[zx-auto] not found$config[zx-overlay] not found