Interceptor Interceptor di SpringMVC juga sangat penting dan bermanfaat. Fungsi utamanya adalah mencegat permintaan pengguna dan melakukan pemrosesan yang sesuai. Misalnya, dapat melakukan verifikasi izin, atau menentukan apakah pengguna masuk, atau menentukan apakah waktu saat ini adalah waktu pembelian tiket seperti 12306.
1. Tentukan kelas implementasi pencegat
Permintaan Interceptor Intercept di SpringMVC diimplementasikan melalui HandlerInterceptor. Mendefinisikan interseptor di SpringMVC sangat sederhana. Ada dua cara utama. Cara pertama adalah mendefinisikan kelas pencegat yang mengimplementasikan antarmuka pegas handlerinteptor, atau kelas ini mewarisi kelas yang mengimplementasikan antarmuka handlerinteptor, seperti kelas abstrak yang disediakan Spring yang mengimplementasikan antarmuka handlerinterceptor, yang sudah disediakan oleh pegas; Cara kedua adalah mengimplementasikan antarmuka Spring WebRequestInterceptor, atau mewarisi kelas yang mengimplementasikan antarmuka WebRequestInterceptor.
(I) Menerapkan antarmuka handlerinterceptor
Ada tiga metode yang ditentukan dalam antarmuka handlerinterceptor, dan kami menggunakan tiga metode ini untuk mencegat permintaan pengguna.
(1) Permintaan preHandle (httpservletRequest, respons httpservletResponse, pegangan objek), seperti namanya, akan dipanggil sebelum permintaan diproses. Interceptor di SpringMVC disebut dalam bentuk rantai. Beberapa pencegat dapat ada pada saat yang sama dalam suatu aplikasi atau dalam permintaan. Setiap panggilan pencegat akan dieksekusi secara berurutan sesuai dengan perintah deklarasi, dan yang pertama dieksekusi adalah metode prehandle dalam pencegat, sehingga beberapa operasi pra-inisialisasi dapat dilakukan dalam metode ini atau pra-pemrosesan permintaan saat ini, atau beberapa penilaian dapat dilakukan dalam metode ini untuk memutuskan apakah permintaan harus dilanjutkan.
Nilai pengembalian metode ini adalah boolean tipe boolean. Ketika kembali ke False, itu berarti bahwa permintaan berakhir, dan interseptor dan pengontrol berikutnya tidak akan dieksekusi lagi; Ketika nilai pengembalian benar, metode Prehandle dari pencegat berikutnya akan terus dipanggil. Jika sudah menjadi pencegat terakhir, metode pengontrol dari permintaan saat ini akan dipanggil.
(2) Posthandle (permintaan httpservletRequest, respons httpservletResponse, pegangan objek, model dan model model danview). Dari penjelasan metode prehandle, kita tahu bahwa metode ini, termasuk metode setelah pemegang lipat yang akan disebutkan nanti, hanya dapat dipanggil ketika nilai pengembalian metode preHandle dari pencegat saat ini benar.
Metode Posthandle, seperti namanya, dieksekusi setelah permintaan saat ini diproses, yaitu, setelah metode pengontrol dipanggil, tetapi akan dipanggil sebelum DispatcherServlet mengembalikan dan membuat tampilan, sehingga kami dapat beroperasi pada objek ModelAndview setelah proses pengontrol dalam metode ini. Arah panggilan metode posthandle adalah kebalikan dari prehandle, yang berarti bahwa metode posthandle dari pencegat yang dinyatakan terlebih dahulu akan dieksekusi nanti, yang agak mirip dengan proses eksekusi pencegat di Struts2. Proses eksekusi pencegat di Struts2 juga dirantai, tetapi di Struts2, metode invoke dari ActionInvocation perlu dipanggil secara manual untuk memicu panggilan ke pencegat atau tindakan berikutnya. Kemudian konten di setiap pencegat sebelum metode Invoke dieksekusi dalam urutan yang dinyatakan, dan konten setelah metode Invoke dibalik.
(3) Afterkompetion (permintaan httpservletRequest, respons httpservletResponse, pegangan objek, metode pengecualian ex), metode ini perlu dieksekusi ketika nilai pengembalian dari metode preHandle pencegat yang sesuai saat ini benar. Seperti namanya, metode ini akan dieksekusi setelah seluruh permintaan selesai, yaitu, setelah DispatcherServlet membuat tampilan yang sesuai. Fungsi utama dari metode ini adalah membersihkan sumber daya.
Berikut ini adalah deskripsi kode sederhana:
impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor org.springframework.web.servlet.handlerInterceptor; impor org.springframework.web.servlet.modelandview; Kelas Publik SpringMVCInterceptor mengimplementasikan HandlerInterceptor { /*** Metode Prehandle digunakan untuk intersepsi prosesor. Seperti namanya, metode ini akan dipanggil sebelum proses pengontrol. Interceptor Interceptor di SpringMVC dirantai, dan beberapa pencegat dapat ada pada saat yang sama. Kemudian SpringMVC akan mengeksekusi satu per satu sesuai dengan urutan deklarasi, dan semua metode prehandle di Interceptor akan dipanggil sebelum metode pengontrol dipanggil. Struktur rantai interseptor SpringMVC juga dapat terganggu. Metode interupsi ini membuat nilai pengembalian prehandle menjadi false. Ketika nilai pengembalian prehandle salah, seluruh permintaan berakhir. */ @Override Public Boolean Prehandle (permintaan httpservletRequest, respons httpservletResponse, penangan objek) melempar Exception {// TODO Metode yang dihasilkan secara otomatis Stub Return False; } /*** Metode ini hanya akan dieksekusi ketika nilai pengembalian saat ini dari metode prehandle dari pencegat adalah benar. Posthandle digunakan untuk intersepsi prosesor. Waktu pelaksanaannya adalah setelah prosesor diproses*, yaitu, setelah metode pengontrol dipanggil, tetapi akan dieksekusi sebelum DispatcherServlet memberikan tampilan, yang berarti bahwa dalam metode ini Anda dapat mengoperasikan ModelAndView*. Struktur rantai metode ini adalah kebalikan dari arah akses normal, yaitu metode yang dinyatakan terlebih dahulu akan dipanggil nanti. Ini agak mirip dengan proses eksekusi pencegat di Struts2. * Hanya dalam metode intersep di Struts2, metode invoke dari ActionInvocation harus dipanggil secara manual. Metode Invoke dari ActionInvocation di Struts2 adalah untuk memanggil Interceptor berikutnya * atau memanggil tindakan, dan kemudian konten yang perlu dipanggil sebelum pencegat ditulis sebelum panggilan untuk memohon, dan konten yang perlu dipanggil setelah pencegat ditulis setelah panggilan ke metode Invoke. * / @Override public void posthandle (permintaan httpservletRequest, httpservletResponse respons, penangan objek, model dan model modelAndView) melempar pengecualian {// TODO Metode yang dihasilkan otomatis Stub} / *** Metode ini juga perlu dieksekusi ketika nilai pengembalian dari interceptor yang sesuai saat ini. Metode ini akan dieksekusi setelah seluruh permintaan selesai, yaitu, DispatcherServlet membuat eksekusi tampilan. * Fungsi utama dari metode ini adalah membersihkan sumber daya. Tentu saja, metode ini hanya dapat dieksekusi ketika nilai pengembalian saat ini dari metode preHandle dari pencegat adalah benar. */ @Override public void aftercompletion (permintaan httpservletrequest, respons httpservletresponse, penangan objek, pengecualian ex) melempar Exception {// TODO Metode yang dihasilkan otomatis Stub}} (Ii) Menerapkan antarmuka WebRequestInterceptor
Ada juga tiga metode yang didefinisikan dalam WebRequestInterceptor, dan kami juga menggunakan tiga metode ini untuk menerapkan intersepsi. Ketiga metode ini melewati parameter WebRequest yang sama, jadi apa WebRequest ini? WebRequest ini adalah antarmuka yang ditentukan oleh Spring. Definisi metode di dalamnya pada dasarnya sama dengan httpservletRequest. Semua operasi yang dilakukan di WebRequestInterceptor di WebRequestInterceptor akan disinkronkan ke HTTPServletRequest, dan kemudian disahkan dalam permintaan saat ini.
(1) Metode Prehandle (WebRequest Request). Metode ini akan dipanggil sebelum permintaan diproses, yaitu, akan dipanggil sebelum metode pengontrol dipanggil. Metode ini berbeda dari prehandle di handlerinterceptor. Perbedaan utama adalah bahwa nilai pengembalian metode ini batal, yang berarti tidak ada nilai pengembalian. Karena itu, kami biasanya menggunakannya untuk menyiapkan sumber daya. Misalnya, ketika kita menggunakan hibernate, kita dapat menyiapkan objek sesi hibernate dalam metode ini, dan kemudian menggunakan setAttribute (nama, nilai, ruang lingkup) WebRequest untuk memasukkannya ke properti WebRequest. Di sini kita dapat berbicara tentang ruang lingkup parameter ketiga dari metode setAttribute, yang merupakan tipe integer. Tiga konstanta didefinisikan untuk Antarmuka Lapisan Induk WebRequest RequestAttributes:
Scope_request: nilainya adalah 0, yang berarti hanya dapat diakses dalam permintaan.
Scope_Session: Nilainya adalah 1. Jika lingkungan mengizinkannya, itu mewakili sesi terisolasi lokal, jika tidak itu mewakili sesi normal dan dapat diakses dalam lingkup sesi.
Scope_global_session: nilainya adalah 2. Jika lingkungan mengizinkannya, itu mewakili sesi bersama secara global, jika tidak itu mewakili sesi normal dan dapat diakses dalam ruang lingkup sesi.
(2) Metode Posthandle (Permintaan WebRequest, ModelMap Model). Metode ini akan dipanggil setelah pemrosesan permintaan, yaitu, setelah metode pengontrol dipanggil, tetapi akan dipanggil sebelum tampilan pengembalian diberikan, sehingga Anda dapat mengubah tampilan data dengan mengubah model model data dalam metode ini. Metode ini memiliki dua parameter. Objek WebRequest digunakan untuk meneruskan seluruh data permintaan. Misalnya, data yang disiapkan di Prehandle dapat diteruskan dan diakses melalui WebRequest; ModelMap adalah objek model yang dikembalikan setelah proses pengontrol. Kita dapat mengubah model model yang dikembalikan dengan mengubah propertinya.
(3) Metode AfterKompletion (Permintaan WebRequest, Pengecualian EX). Metode ini akan dieksekusi setelah seluruh permintaan diproses, yaitu, setelah pandangan dikembalikan dan diterjemahkan. Oleh karena itu, dalam metode ini, operasi rilis sumber daya dapat dilakukan. Parameter WebRequest dapat melewati sumber daya yang kami siapkan di Prehandle di sini untuk rilis. Parameter pengecualian mewakili objek pengecualian yang saat ini diminta. Jika pengecualian yang dilemparkan pada pengontrol telah diproses oleh prosesor pengecualian pegas, maka objek pengecualian adalah nol.
Berikut ini adalah deskripsi kode sederhana:
impor org.springframework.ui.modelmap; impor org.springframework.web.context.request.webRequest; impor org.springframework.web.context.request.webRequestInterceptor; Kelas Publik AllInterceptor mengimplementasikan WebRequestInterceptor { /*** dieksekusi sebelum permintaan diproses. Metode ini terutama digunakan untuk menyiapkan data sumber daya, dan kemudian dapat dimasukkan ke dalam WebRequest sebagai Atribut Permintaan*/ @Override public void prehandle (WebRequest Request) melempar Exception {// Todo Metode Stub System.out.println ("AllInterceptor .................."); request.setAttribute ("Request", "Request", WebRequest.scope_request); // Ini ditempatkan di dalam ruang lingkup permintaan, sehingga Anda hanya bisa mendapatkan permintaan.setAttribute ("sesi", "sesi", dalam permintaan dalam permintaan saat ini. Jika lingkungan mengizinkannya, itu hanya dapat diakses dalam sesi yang terisolasi secara lokal. Kalau tidak, itu dapat diakses di sesi normal saat ini. Request.setAttribute ("GlobalSession", "GlobalSession", WebRequest.Scope_Global_Session); // Jika lingkungan mengizinkannya, itu dapat diakses dalam sesi bersama secara global, jika tidak dapat diakses dalam sesi normal saat ini}/*** Metode ini akan dieksekusi setelah pengontrol dieksekusi dan sebelum kembali ke tampilan. ModelMap mewakili objek model yang dikembalikan setelah pengontrol diminta untuk memproses pengontrol, sehingga sifat -sifat ModelMap dapat dimodifikasi dalam metode ini untuk mencapai efek mengubah model yang dikembalikan. */ @Override public void posthandle (Permintaan WebRequest, ModelMap Map) melempar Exception {// TODO METODE AUTO-ENTO-METODE Stub untuk (Kunci String: Map.Keyset ()) System.out.println (Key + "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- AfterCompletion (Permintaan WebRequest, Pengecualian Pengecualian) Melempar Pengecualian {// TODO Metode Stub System.out.out.println (Exception + "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= "); }}2. Tambahkan kelas pencegat yang ditentukan ke sistem intersepsi springmvc
1. Tambahkan skema yang mendukung MVC dalam file konfigurasi SpringMVC
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemalocation = "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd "
Berikut adalah contoh dari pernyataan saya:
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: konteks = "http: xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemalocation = "http://www.springframework.org/schema/beans http:/wwww.spramework.orgal http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/www.spramework.org/schema/schema/www.spramework.org/schema/schema/www.spramework.org/schema/schema/www.spramework.org/schema/schema/www.spramework.org/schema/schema/sprammor http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ">
Dengan cara ini, Anda dapat menggunakan tag MVC di file konfigurasi SpringMVC. Ada MVC: Interceptor dalam tag MVC yang digunakan untuk mendeklarasikan pencegat SpringMVC.
(Ii) Gunakan tag MVC: Interceptor untuk mendeklarasikan pencegat yang perlu ditambahkan ke rantai pencegat SpringMVC
<MVC: Interceptors> <!- Gunakan kacang untuk mendefinisikan pencegat. Interceptor langsung didefinisikan di bawah root MVC: Interceptor akan mencegat semua permintaan-> <bean/> <mvc: interceptor> <mvc: pemetaan path = "/test/number.do"/> <!-representasi yang ditentukan di bawah MVC: Interceptor adalah untuk mencegat permintaan spesifik-> <bean//mvc: Mvc: Intercepor untuk mencegat permintaan spesifik-<bean/mvc: mvc: Mvc:
Dari contoh di atas, kita dapat melihat bahwa serangkaian pencegat dapat dinyatakan menggunakan tag MVC: Interceptors, dan kemudian mereka dapat membentuk rantai pencegat. Perintah eksekusi pencegat dieksekusi dalam urutan deklarasi. Metode Prehandle dalam pencegat yang dinyatakan akan dieksekusi terlebih dahulu, tetapi metode posthandle dan metode setelah pelepasan akan dieksekusi nanti.
Ada dua cara utama untuk mendeklarasikan pencegat di bawah MVC: Tag Interceptor:
(1) Langsung mendefinisikan objek kacang dari kelas implementasi interseptor. Interceptor Interceptor dinyatakan dengan cara ini akan mencegat semua permintaan.
(2) Gunakan tag MVC: Interceptor untuk menyatakan. Interceptor dinyatakan dengan cara ini dapat menentukan jalur permintaan yang perlu dicegat melalui subtag MVC: pemetaan.
Setelah dua langkah di atas, pencegat yang ditentukan akan bertindak untuk mencegat permintaan tertentu.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.