1. Ikhtisar
Pencegat lebih banyak digunakan, terutama setelah popularitas pemrograman Slice. Jadi apa yang biasanya bisa dilakukan pencegat?
Dalam Pengantar Agen kami, kami menyebutkan bahwa panggilan fungsi statistik membutuhkan waktu. Gagasan ini sebenarnya persis sama dengan peningkatan AOP surround.
Secara umum, skenarionya adalah sebagai berikut:
Dan lainnya dan sebagainya.
2. Interceptor Spring
Apakah itu springmvc atau springboot, kami harus menyebutkan pencegat:
org.springframework.web.servlet.handler.handlerInterceptorAdapter
Publik Abstrak HandlerInterceptorAdapter mengimplementasikan asynchandlerinterceptor {// mengeksekusi @Override public boolean prehandle (permintaan httpservletrequest, respons httpservletResponse, penangan objek) melempar pengecualian {return true; } // Jalankan setelah metode target dieksekusi, tetapi sebelum permintaan kembali, kami masih dapat memodifikasi ModelAndView @Override public void posthandle (httpservletRequest Request, httpservletResponse response, ModelDview ModelDView) melempar pengecualian {} // execute @overrpspet (excuteRPS void) Respons HttpServletResponse, penangan objek, Pengecualian EX) melempar Exception {} // digunakan untuk menangani permintaan asinkron. Metode ini akan dipicu ketika ada metode permintaan asinkron dalam controller @Override public void aftercurrenthandlingstarted (permintaan httpservletrequest, respons httpservletResponse, penangan objek) melempar pengecualian {}}Menerapkan pencegat untuk memverifikasi izin sederhana
1. Kustomisasi anotasi izin @Auth
@Diwarisi@target ({elementType.type, elementType.method})@retention(retensipolicy.runtime)@documentedpublic @interface auth {string user () default "";}2. Tambahkan anotasi ke metode pengontrol
Setelah menambahkan anotasi pada langkah sebelumnya, Anda harus menambahkan anotasi yang relevan ke metode yang Anda gunakan, sebagai berikut.
@Restcontroller @enableAutoconfigurationPublic kelas democontroller {@Auth (user = "admin") @RequestMapping (value = "/hello", method = requestMethod.get) string publik sayshello () {return "Hello world."; }}3. Menerapkan fungsi pencegat
Persyaratan: Ketika pengguna mengakses URI melalui /halo, itu diverifikasi. Jika admin, itu akan dirilis, jika tidak itu akan ditolak. Asumsikan bahwa identitas pengguna ada dalam parameter URL.
Ide: Oleh karena itu, kita perlu memverifikasi pengguna sebelum menjalankan Sayshello (). Jika identitasnya sama dengan identitas dalam anotasi, itu akan dirilis. Karena itu, kita perlu membuat keributan di prehandle ().
Kesulitan: Bagaimana kita mendapatkan anotasi @Auth pada metode pengontrol? Melihat tiga parameter prehandle (), tampaknya tidak ada yang dapat memberikan anotasi di kelas pengontrol.
Faktanya, penangan parameter ketiga, secara umum, jenisnya adalah: org.springframework.web.method.handlermethod, dan berisi informasi yang relevan tentang anotasi.
Kenapa kamu bilang begitu?
Di Springboot, jenis anotasi default adalah level fungsi, sedangkan di SpringMVC jenis defaultnya adalah level objek pengontrol.
Oleh karena itu, jika Anda perlu mengonfigurasinya di dispatcher-servlet.xml di springmvc:
<bean/>, sehingga jenisnya adalah handlermethod.
Mari kita lihat logika implementasi spesifik:
@Override Public Boolean Prehandle (permintaan httpservletRequest, respons httpservletResponse, penangan objek) melempar pengecualian {system.out.println ("preHandle"); if (! handler.getClass (). isAssignableFrom (handlermethod.class)) {System.out.println ("Cat Cast Handler ke handlermethod.class"); Kembali Benar; } // Dapatkan annotation auth auth = ((handlermethod) handler) .getMethod (). GetAnnotation (auth.class); if (auth == null) {System.out.println ("tidak dapat menemukan @Auth di URI ini:" + request.getRequesturi ()); Kembali Benar; } // Keluarkan identitas pengguna dari parameter dan verifikasi string admin = auth.user (); if (! admin.equals (request.getParameter ("user"))) {System.out.println ("Izin ditolak"); response.setstatus (403); mengembalikan false; } return true; }Bahkan, ada dua poin dalam logika implementasi: Keluarkan identitas dari parameter dan bandingkan dengan anotasi.
4. Konfigurasikan pencegat
Jadi bagaimana pencegat sekarang menjadi efektif?
Saat ini, kita perlu mengonfigurasi: WebMvCconfigurerAdapter
Implementasi spesifik adalah sebagai berikut:
@ConfigurationPublic Class ConfigAdapter memperluas WebMvCconfigurerAdapter {@Override public void addInterceptors (interceptorregistry registry) {registry.addInterceptor (new LoginInterceptor ()). AddPathPatterns ("/hello"); }}Catatan: Ada dua poin yang perlu diperhatikan di sini. Salah satunya adalah anotasi @Configuration, sehingga layanan Springboot dapat menemukan konfigurasi ini; Yang lainnya adalah kecocokan konfigurasi, yaitu mencegat "/halo". ("/**" adalah untuk memblokir semua akses)
4. Operasi
Kunjungi http://127.0.0.1:8080/hello?user=admin untuk melihat hasilnya.
Untuk detail kode dalam artikel ini, silakan merujuk ke: https://github.com/hawkingfoo/springboot-interceptor
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.