Artikel ini terutama mempelajari pengenalan pencegat di SpringMVC, Contoh Kode, Konfigurasi dan Konten Lainnya, sebagai berikut.
Prosesor Interceptor SpringMVC mirip dengan filter filter dalam pengembangan servlet, yang digunakan untuk pra-proses dan pasca-proses prosesor. Artikel ini terutama merangkum bagaimana interseptor didefinisikan dalam SpringMVC, serta eksekusi dan penggunaan pencegat.
Di SpringMVC, tentukan Interceptor untuk mengimplementasikan antarmuka HandlerInterceptor dan mengimplementasikan tiga metode yang disediakan di antarmuka, sebagai berikut:
// uji interceptor1public class handlerInterceptor1 mengimplementasikan handlerInterceptor {@Override public boolean prehandle (httpservletRequest permintaan, httpservletResponse response, not Object Handler) Lempar Exception {System.out.println ("HandlerIndInderCepor1 .... PreHandle"); True Means Release Return true;}@override public void posthandle (permintaan httpservletRequest, respons httpservletResponse, penangan objek, model dan model modelAndView) lemparan Exception {System.out.println ("HandlerInterceptor1..posthandle");}@outcomplride voidPetPSPSPPSPPS (POSTHANDLE ");}@override voidcoidpspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspspret Sebutan HTTPServletResponse Response, Object Handler, Exception Ex) melempar Exception {System.out.println ("HandlerInterceptor1..AfterCompletion");}}Saya akan melakukan analisis sederhana untuk ketiga metode ini:
Di SpringMVC, pencegat dikonfigurasi untuk handlermapping spesifik, yaitu, jika pencegat dikonfigurasi dalam handlermapping, pawang berhasil dipetakan melalui handlermapping pada akhirnya akan menggunakan pencegat. Misalnya, misalkan mapper yang kami konfigurasi dalam file konfigurasi adalah org.springframework.web.servlet.handler.beannameUrlHandlermapping, maka kami dapat mengkonfigurasi pencegat sebagai berikut:
<Bean> <name properti = "interceptors"> <cist> <ref bean = "handlerinterceptor1"/> <ref bean = "handlerinteptor2"/> </list> </preate> </ bean> <bean id = "handlerinterceptor1"/> <bean id = "handlerInterceptor2"/>
Jadi di SpringMVC, bagaimana cara mengkonfigurasi pencegat global? Seperti disebutkan di atas, pencegat di SpringMVC ditargetkan pada pemetaan tertentu. Untuk mengatasi masalah ini, kerangka kerja SpringMVC menyuntikkan yang dikonfigurasi secara global pencegat serupa ke dalam setiap handlermapping, sehingga mereka dapat menjadi pencegat global. Konfigurasinya adalah sebagai berikut:
<!-- Configure interceptors--><mvc:interceptors> <!-- Multiple interceptors, executed in sequence--> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- Indicates intercepting all urls including suburl paths--> <bean/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path = "/**"/> <bean/> </mvc: Interceptor>
Secara umum, kami menggunakan konfigurasi ini, cukup tentukan URL untuk dicegat di <mvc: pemetaan>.
Tulis dua interseptor, handlerinterceptor2 dan handlerinterceptor3, sesuai dengan konfigurasi di atas. Kemudian kami akan menguji eksekusi tiga interseptor dan membuat ringkasan terkait.
Dengan kata lain, kami mengubah nilai pengembalian metode prehandle dari tiga interseptor untuk benar untuk menguji urutan eksekusi pencegat. Hasil tes adalah sebagai berikut:
HandlerInterceptor1… .prehandle
HandlerInterceptor2… .Prehandle
HandlerInterceptor3… .prehandleHandlerInterceptor3… .posthandle
HandlerInterceptor2… .posthandle
HandlerInterceptor1… .posthandleHandlerInterceptor3 .... AFterCompetion
HandlerInterceptor2 .... AFterCompletion
HandlerInterceptor1 .... AFterCompetion
Ringkasan dibuat berdasarkan hasil yang dicetak: ketika semua pencegat dirilis, metode prehandle dieksekusi dalam urutan konfigurasi; sedangkan dua metode lainnya dieksekusi dalam urutan konfigurasi.
Kami mengubah nilai pengembalian dalam metode prehandle dari pencegat ketiga menjadi false, dan dua yang pertama masih benar, untuk menguji urutan eksekusi pencegat. Hasil tes adalah sebagai berikut:
HandlerInterceptor1… .prehandle
HandlerInterceptor2… .Prehandle
HandlerInterceptor3… .prehandleHandlerInterceptor2 .... AFterCompletion
HandlerInterceptor1 .... AFterCompetion
Buat ringkasan berdasarkan hasil yang dicetak:
1. Karena Interceptors 1 dan 2 dirilis, prehandle of Interceptor 3 dapat dieksekusi. Dengan kata lain, pencegat sebelumnya dapat dirilis, dan pencegat terakhir dapat mengeksekusi prehandle.
2. Interceptor 3 tidak merilisnya, jadi dua metode lainnya tidak dieksekusi. Artinya, jika pencegat tidak melepaskannya, maka dua metode lainnya tidak akan dieksekusi.
3. Selama ada interseptor yang tidak dirilis, metode posthandle dari semua pencegat tidak akan dieksekusi, tetapi selama Prehandle dieksekusi dan dirilis, metode afterkompletion akan dieksekusi.
Bahkan, Anda dapat merujuk pada situasi di atas. Ini adalah kasus khusus. Mari kita lihat hasil berjalan:
HandlerInterceptor1… .prehandle
Jelas, hanya metode prehandle dari pencegat pertama yang dieksekusi. Karena tidak satu pun dari mereka yang dibebaskan, tidak ada dari mereka yang mengeksekusi metode Posthandle dan metode afterkompletion.
Dari kasus kedua, misalnya, jika Anda ingin menulis logika pemrosesan pengecualian terpadu, maka interseptor harus ditempatkan di posisi pertama rantai pencegat dan harus dilepaskan, karena hanya kompleksinya yang akan dieksekusi, dan jika ditempatkan pada posisi pertama dari rantai interseptor, metode yang dieksekusi.
Misalnya, masuk ke Authentication Interceptor dan letakkan di posisi pertama di tautan Interceptor (jika ada penanganan pengecualian terpadu, itu harus ditempatkan di belakang penanganan pengecualian terpadu). Interceptor verifikasi izin ditempatkan setelah masuk ke pencegat otentikasi (karena izin hanya diverifikasi setelah masuk).
Berikut ini adalah pencegat verifikasi login untuk menjelaskan cara menggunakan pencegat SpringMVC.
Pertama, mari kita lihat persyaratannya: apa yang ingin kita integrik, apa yang ingin kita lakukan saat kita mencegat. Idenya adalah sebagai berikut:
1. URL Permintaan Pengguna
2. Interceptor melakukan verifikasi intersepsi. Jika URL yang diminta adalah alamat publik (URL yang dapat diakses tanpa masuk), biarkan dirilis.
Jika sesi pengguna tidak ada, maka lompat ke halaman login.
Jika sesi pengguna ada, lepaskan dan lanjutkan operasi.
// Masuk di @RequestMapping ("/Login") Public String Login (permintaan httpservletRequest, string nama pengguna, kata sandi string) melempar pengecualian {// pada kenyataannya, Anda perlu mencocokkan database //...//di shere, asumsikan bahwa login yang berhasil ("USERNOMETEMETEMESSESSESSEMESSESSEMESSESSEMESSSESSESSEMETEMETEMETEMETEMETEMETEMETEMETEMETEMETEMETEMETEMET/USOME (USENOME () "Redirect: QueryItems.action";} // Login @RequestMapping ("/Logout") Public String Logout (permintaan httpservletRequest) Lempar Pengecualian {httpsession session = request.getSession (); session.invalidate (); return "redirect: queryitems.action"; // Tes Interceptor 1Public Class LoginInterceptor mengimplementasikan HandlerInterceptor {// Execute sebelum memasukkan metode pawang // dapat digunakan untuk otentikasi identitas dan otorisasi identitas. Jika otentikasi tidak lewat, itu berarti bahwa pengguna tidak masuk. Metode ini perlu mencegatnya dan tidak ada eksekusi lebih lanjut. Kalau tidak, @Override public boolean prehandle (permintaan httpservletRequest, respons httpservletresponse, penangan objek) melempar pengecualian {// dapatkan urlString urlsring = permintaan. alamat yang dikirimkan jika (url.indexof ("login.action")> 0) {// Jika pengiriman login dilakukan, rilis rilis true;} // juri sessionhtpsession session = request.getSession (); // ambil informasi identitas pengguna dari string sesi USERNAME = (string) session.getattribute ("Username"); menunjukkan bahwa identitas pengguna perlu diverifikasi, lompat ke permintaan halaman login.getRequestDispatcher ("/web-inf/jsp/login.jsp"). Maju (permintaan, respons); kembalikan false;} // hemat ruang, hilangkan dua metode lainnya dan jangan menulisnya, dan tidak perlu berurusan dengan mereka}Kemudian konfigurasikan pencegat:
<!-Mengkonfigurasi Interceptors-> <MVC: Interceptors> <!-Multiple Interceptors, Execute secara berurutan-> <MVC: Interceptor> <MVC: Mapping Path = "/**"/> <!-mencegat semua URL termasuk jalur suburl-> <bean/</mvc: intercepor> <!
Dengan cara ini, ketika kami meminta URL apa pun, kami akan ditangkap oleh Interceptor yang baru saja kami tentukan, dan kemudian kami akan menentukan apakah ada informasi pengguna di sesi tersebut. Jika tidak, kami akan melompat ke halaman login dan membiarkan kami masuk:
<Form Action = "$ {pageContext.Request.ContextPath} /Login.action" Method = "POST"> Nama pengguna: <input type = "Text" name = "username" /> <br> kata sandi: <input type = "kata sandi" = "kata sandi" /> <br> <input type = "kirim" name "Ini pada dasarnya adalah pengantar penggunaan pencegat.
Di atas adalah semua konten dari artikel ini tentang penjelasan terperinci tentang pencegat di SpringMVC dan contoh kode. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!