Mengubah Parameter Model Pegas dengan Handler Interceptor

1. Perkenalan

Dalam tutorial ini kita akan fokus pada Spring MVC HandlerInterceptor. Lebih khusus lagi, kami akan mengubah parameter model Spring MVC sebelum dan sesudah menangani permintaan.

Jika Anda ingin membaca tentang dasar - dasar HandlerInterceptor , lihat artikel ini.

2. Ketergantungan Maven

Untuk menggunakan Interceptors , Anda perlu menyertakan bagian berikut di bagian dependensi file pom.xml Anda :

 org.springframework spring-web 5.2.8.RELEASE  

Versi terbaru dapat ditemukan di sini.

Ketergantungan ini hanya mencakup Spring Web jadi jangan lupa untuk menambahkan s pring-core dan spring-context untuk aplikasi web lengkap, dan perpustakaan logging pilihan Anda.

3. Implementasi Kustom

Salah satu kasus penggunaan HandlerInterceptor adalah menambahkan parameter umum / khusus pengguna ke model, yang akan tersedia di setiap tampilan yang dihasilkan.

Dalam contoh kami, kami akan menggunakan implementasi pencegat khusus untuk menambahkan nama pengguna pengguna yang dicatat ke parameter model. Dalam sistem yang lebih kompleks, kami dapat menambahkan informasi yang lebih spesifik seperti: jalur avatar pengguna, lokasi pengguna, dll.

Mari kita mulai dengan mendefinisikan kelas Interceptor baru kita :

public class UserInterceptor extends HandlerInterceptorAdapter { private static Logger log = LoggerFactory.getLogger(UserInterceptor.class); ... }

Kami memperluas HandlerInterceptorAdapter , karena kami hanya ingin mengimplementasikan metode preHandle () dan postHandle () .

Seperti yang kami sebutkan sebelumnya, kami ingin menambahkan nama pengguna yang dicatat ke model. Pertama-tama, kita perlu memeriksa apakah ada pengguna yang masuk. Kita dapat memperoleh informasi ini dengan memeriksa SecurityContextHolder :

public static boolean isUserLogged() { try { return !SecurityContextHolder.getContext().getAuthentication() .getName().equals("anonymousUser"); } catch (Exception e) { return false; } }

Ketika HttpSession dibuat, tetapi tidak ada yang masuk, nama pengguna dalam konteks Keamanan Musim Semi sama dengan anonymousUser . Selanjutnya, kami melanjutkan dengan implementasi preHandle ():

3.1. Metode preHandle ()

Sebelum menangani permintaan, kami tidak dapat mengakses parameter model. Untuk menambahkan nama pengguna, kita perlu menggunakan HttpSession untuk mengatur parameter:

@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { if (isUserLogged()) { addToModelUserDetails(request.getSession()); } return true; }

Ini penting jika kami menggunakan beberapa informasi ini sebelum menangani permintaan. Seperti yang kita lihat, kami memeriksa apakah pengguna masuk dan kemudian menambahkan parameter ke permintaan kami dengan mendapatkan sesinya:

private void addToModelUserDetails(HttpSession session) { log.info("=============== addToModelUserDetails ========================="); String loggedUsername = SecurityContextHolder.getContext().getAuthentication().getName(); session.setAttribute("username", loggedUsername); log.info("user(" + loggedUsername + ") session : " + session); log.info("=============== addToModelUserDetails ========================="); }

Kami menggunakan SecurityContextHolder untuk mendapatkan loginUsername . Anda dapat mengganti implementasi Spring Security UserDetails untuk mendapatkan email sebagai ganti nama pengguna standar.

3.2. Metode p ostHandle ()

Setelah menangani permintaan, parameter model kami tersedia, jadi kami dapat mengaksesnya untuk mengubah nilai atau menambahkan yang baru. Untuk melakukan itu, kami menggunakan metode postHandle () yang diganti :

@Override public void postHandle( HttpServletRequest req, HttpServletResponse res, Object o, ModelAndView model) throws Exception { if (model != null && !isRedirectView(model)) { if (isUserLogged()) { addToModelUserDetails(model); } } }

Mari kita lihat detail penerapannya.

Pertama-tama, sebaiknya periksa apakah modelnya tidak null. Ini akan mencegah kita menemui NullPointerException .

Selain itu, kami dapat memeriksa apakah Tampilan bukan merupakan turunan dari Tampilan Pengalihan .

Tidak perlu menambah / mengubah parameter setelah permintaan ditangani dan kemudian dialihkan, karena segera, pengontrol baru akan melakukan penanganan lagi. Untuk memeriksa apakah tampilan dialihkan, kami memperkenalkan metode berikut:

public static boolean isRedirectView(ModelAndView mv) { String viewName = mv.getViewName(); if (viewName.startsWith("redirect:/")) { return true; } View view = mv.getView(); return (view != null && view instanceof SmartView && ((SmartView) view).isRedirectView()); }

Akhirnya, kami memeriksa lagi apakah pengguna masuk, dan jika ya, kami menambahkan parameter ke model Spring:

private void addToModelUserDetails(ModelAndView model) { log.info("=============== addToModelUserDetails ========================="); String loggedUsername = SecurityContextHolder.getContext() .getAuthentication().getName(); model.addObject("loggedUsername", loggedUsername); log.trace("session : " + model.getModel()); log.info("=============== addToModelUserDetails ========================="); }

Harap dicatat bahwa logging sangat penting, karena logika ini bekerja "di belakang layar" aplikasi kita. Sangat mudah untuk melupakan bahwa kami mengubah beberapa parameter model pada setiap Tampilan tanpa mencatatnya dengan benar.

4. Konfigurasi

Untuk menambahkan Interceptor yang baru kita buat ke dalam konfigurasi Spring, kita perlu mengganti metode addInterceptors () di dalam kelas WebConfig yang mengimplementasikan WebMvcConfigurer:

@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInterceptor()); }

Kami dapat mencapai konfigurasi yang sama dengan mengedit file konfigurasi XML Spring kami:

Mulai saat ini, kami dapat mengakses semua parameter terkait pengguna di semua tampilan yang dihasilkan.

Harap perhatikan, jika beberapa Pegas Interceptors dikonfigurasi, metode preHandle () dijalankan dalam urutan konfigurasi sedangkan metode postHandle () dan afterCompletion () dipanggil dalam urutan terbalik.

5. Kesimpulan

Tutorial ini menyajikan permintaan web intersep menggunakan HandlerInterceptor Spring MVC untuk memberikan informasi pengguna.

Dalam contoh khusus ini, kami fokus pada menambahkan detail pengguna yang dicatat di aplikasi web kami ke parameter model. Anda dapat memperluas penerapan HandlerInterceptor ini dengan menambahkan informasi yang lebih detail.

Semua contoh dan konfigurasi tersedia di sini di GitHub.

5.1. Artikel dalam Seri

Semua artikel dari seri:

  • Pengantar Spring MVC Handler Interceptors
  • Mengubah Parameter Model Pegas dengan Handler Interceptor (yang satu ini)