Artikel ini terutama memperkenalkan Interceptor SpringMVC, sebagai berikut:
1.DispatcherServlet
SpringMVC memiliki DispatcherServlet entri terpadu, dan semua permintaan melewati DispatcherServlet.
DispatcherServlet adalah pra-kontrol yang dikonfigurasi dalam file web.xml. Untuk mencegat permintaan pencocokan, aturan pencocokan intersep servlet harus ditentukan dengan sendirinya, dan permintaan yang dicegat harus didistribusikan ke pengontrol target sesuai dengan aturan tertentu untuk diproses. Jadi kami sekarang menambahkan konfigurasi berikut ke web.xml:
<!-- When initializing the DispatcherServlet, the framework looks for a file named [servlet-name]-servlet.xml in the web application WEB-INF directory, and defines the relevant beans there, overriding any beans defined globally --> <servlet> <servlet-name>springMybatis</servlet-name> <servlet-class> org.springframework.web.servlet.dispatcherServlet </servlet-class> <boad-on-startup> 1 </boad-on-startup> </servlet> <servlet-Mapping> <servlet-name> SpringMybatis </Servlet-name> <!-Semua permintaan akan diolah oleh Dispatch> </servlet-name> <!-Semua permintaan akan diolah oleh DISPATCATCETED-SPRINGATES-SERVERLICER-SERVLET-name> <!-Semua permintaan akan diproses oleh Dispatch> SpringMyBatis </Servlet-name> <! </servlet-Mapping>
2. Sumber daya statis tidak mencegat
Jika Anda hanya mengonfigurasi pencegat URL yang mirip dengan format *.do, tidak ada masalah dengan mengakses sumber daya statis. Namun, jika konfigurasi mencegat semua permintaan (seperti "/" kami dikonfigurasi di atas), itu akan menyebabkan sumber daya statis seperti file JS, file CSS, dan file gambar tidak dapat diakses.
Secara umum, pencegat terutama diimplementasikan untuk manajemen izin, terutama mencegat beberapa permintaan URL, sehingga sumber daya statis tidak dicegat. Umumnya ada dua cara untuk menyaring sumber daya statis.
Yang pertama adalah menggunakan <mvc: default-servlet-handler /> (umumnya, nama servlet default dari server aplikasi web adalah "default", jadi di sini kami mengaktifkan DefaultServlet Default Tomcat untuk memproses file statis, dan mengkonfigurasi kode berikut di web.xml :)
<!- Servlet disediakan untuk wadah seperti Tomcat, Jetty, dll., Dan mengubah pemetaan sumber daya statis dari / ke / statis / direktori. Misalnya, ketika Anda mengunjungi http: //localhost/foo.css, sekarang http: //localhost/static/foo.css-> <!-jangan mencegat file statis-> <servlet-mapping> <servlet-name> default </servlet-name> <rrr-pattern>/js/js/* <RURL-PATERS>/CSS/*</RURL-PATERS> <RURL-PATERS>/IMAGMES/*</RURL-PATERS> <RURL-POLAST>/FONTS/*</RURL-PATERS> </SERVLET-MAPPING>
Tomcat, Jetty, JBoss, dan Glassfish nama servlet default-"default"
Resin Nama Servlet Default --- "Resin-File"
WebLogic Default Servlet Name-"Fileservlet"
Nama Servlet Default WebSphere-"SimpleFileServlet"
Jika nama servlet default dari semua server aplikasi web Anda tidak "default", Anda perlu menampilkan yang ditentukan melalui properti default-servlet-name:
<mvc: default-servlet-handler default-servlet-name = "Nama servlet yang digunakan oleh server web secara default" />
Tipe kedua adalah menggunakan <mvc: sumber daya /> dan menambahkan kode berikut ke file konfigurasi springmvc:
<mvc: pemetaan sumber daya = "/js/**" lokasi = "/static_resources/javascript/"/> <mvc: pemetaan sumber daya = "/styles/**" location = "/static_resources/css/"/> <mvc/"/"/gambar/** "/"
3. Interceptor khusus
Pegangan Interceptor SpringMVC's HandlerCeptorAdapter menyediakan tiga metode preHandle, posthandle, dan afterkompletion. Prehandle dipanggil sebelum prosesor layanan memproses permintaan,
Posthandle dieksekusi setelah prosesor bisnis menyelesaikan pelaksanaan permintaan dan menghasilkan tampilan. AfterCompletion dipanggil setelah DispatcherServlet telah sepenuhnya memproses permintaan dan dapat digunakan untuk membersihkan sumber daya, dll. Oleh karena itu, untuk mengimplementasikan logika manajemen izin Anda sendiri, Anda perlu mewarisi HandlerInterceptorAdapter dan menulis ulang tiga metode.
Pertama, tambahkan interseptor saya yang jelas ke springmvc.xml. Logika Implementasi Saya CommonInterceptor.
<!-Mengkonfigurasi Interceptors, Multiple Interceptors, Execute Secara Secara Secara Secara Secara Sekuensi-> <MVC: Interceptors> <MVC: Interceptor> <!-Cocokkan jalur URL. If you do not configure or /**, all Controllers will be intercepted --> <mvc:mapping path="/user/**" /> <mvc:mapping path="/test/**" /> <bean></bean> </mvc:interceptor> <!-- When setting up multiple interceptors, first call the preHandle method in sequence, and then call the postHandle and afterCompletion methods of each interceptor dalam urutan terbalik -> </mvc: Interceptors>
Logika intersepsi saya adalah "Sebelum login, URL akses apa pun akan melompat ke halaman login; setelah login berhasil, lompat ke URL sebelumnya", kode spesifik adalah sebagai berikut:
/ ** * */ paket com.alibaba.interceptor; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor org.slf4j.logger; impor org.slf4j.loggerFactory; impor org.springframework.web.servlet.modelandview; impor org.springframework.web.servlet.handler.handlerinteptoradapter; impor com.alibaba.util.requestutil; / ** * @author tfj * 2014-8-1 */ kelas publik CommonInceptor Extends HandlerInterceptorAdapter {private Final Logger Log = LoggerFactory.getLogger (CommonInterceptor.Class); string akhir public static last_page = "com.alibaba.lastpage"; / * * Gunakan pemetaan reguler ke jalur yang perlu dicegat pemetaan string pribadi; public void setMappingUrl (String MappingUrl) {this.mappingUrl = mappingUrl; } */ /** * Called before the business processor handles the request* If false is returned * Execute all interceptors' afterCompletion() from the current interceptor, then exit the interceptor chain* If true * Execute the next interceptor until all interceptors have been executed* Execute the interceptor controller * Then enter the interceptor chain, * Execute all postHandle() from the last interceptor * Then execute all PostCompletion () Dari PreHandle Public Boolean Public (HttpservletRequest Request terakhir, respons httpservletResponse, penangan objek) melempar pengecualian {if ("get" .equalsignorecase (request.getMethod ())) {requestutil.saverequercoer () (request.getMethod ())) {requestutil.seVerequere () () (request.getMethod ())) {requestutil.saverequer () () () (getmethod ())) {requestutil.saverequer () (); } log.info ("============== 执行顺序: 1 、 prehandle ================="); String requesturi = request.getRequesturi (); String contextPath = request.getContextPath (); String url = requesturi.substring (contextPath.length ()); log.info ("requesturi:"+requesturi); log.info ("ContextPath:"+ContextPath); log.info ("url:"+url); String username = (string) request.getSession (). GetAttribute ("user"); if (username == null) {log.info ("Interceptor: Jump ke halaman login!"); request.getRequestDispatcher ("/web-inf/jsp/login.jsp"). Maju (permintaan, respons); mengembalikan false; } lain return true; } / *** Setelah prosesor bisnis menyelesaikan pemrosesan permintaan, tindakan yang dieksekusi sebelum tampilan dihasilkan* Anda dapat menambahkan data ke ModelAndView, seperti waktu saat ini* / @Override public void posthandle (handler httpservleewreewest, httpservletResponse, penangan objek, model ModelSandiLiew), httpservletResponse, modelview vodydview) log.info ("================================================================================================================================= log.info ("============================================================================================================================================================================= ========================================================================================================================= ======================================================================================================================== ========================================================================================================================= Respons, Object Handler, Exception Ex) melempar Exception {LOG.Info ("============== 执行顺序: 3 、 AfterCompletion ================"); Catatan: Dalam kode di atas, saya menulis permintaan, yang terutama mengimplementasikan fungsi -fungsi seperti mendapatkan permintaan saat ini, objek sesi, menabung dan enkripsi halaman, dan mengeluarkan.
Pada titik ini, pencegat telah diimplementasikan, dan efeknya seperti yang ditunjukkan pada gambar:
Saya akan diblokir dengan mengunjungi /menguji /halo secara langsung
Setelah masuk dengan sukses, itu akan melompat ke halaman yang sesuai dengan /tes /halo
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.