Mendedahkan mekanisme pelaksanaan Spring interceptor
Apabila membangunkan aplikasi web, kita selalunya perlu melakukan operasi tertentu sebelum atau selepas permintaan sampai ke pengawal. Contohnya, sahkan pengguna, rekod log, kendalikan pengecualian, dsb. Rangka kerja Spring memberi kami pemintas (Pemintas) untuk melaksanakan operasi ini Pemintas boleh pra-proses dan permintaan dan respons selepas.
Artikel ini akan menyelidiki mekanisme pelaksanaan pemintas Spring. Kami akan memahami apa itu pemintas, cara ia berfungsi dan menunjukkan cara melaksanakan pemintas tersuai melalui contoh kod tertentu.
Pemintas ialah mekanisme dalam rangka Spring untuk permintaan pra dan pasca pemprosesan. Ia serupa dengan penapis dalam Servlets, tetapi tidak seperti penapis, pemintas adalah berasaskan peringkat kaedah. Ia boleh memintas kaedah dalam Pengawal yang ditentukan dan melaksanakan logik tersuai sebelum dan selepas kaedah itu dilaksanakan. Pemintas boleh membantu kami melaksanakan beberapa pemprosesan umum yang tiada kaitan dengan logik perniagaan dan meningkatkan kebolehgunaan semula dan kebolehselenggaraan kod.
Pemintas dilaksanakan melalui AOP (Aspect Oriented Programming). Pemintas spring adalah berdasarkan antara muka HandlerInterceptor, yang mentakrifkan tiga kaedah: preHandle, postHandle dan afterCompletion. Aliran kerja khusus adalah seperti berikut:
DispatcherServlet akan memanggil kaedah preHandle setiap pemintas secara bergilir-gilir dan menyemak nilai pulangan kaedah tersebut.
Yang berikut menggunakan contoh khusus untuk menunjukkan cara melaksanakan pemintas tersuai.
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在方法执行之前进行逻辑处理 System.out.println("拦截器preHandle方法执行"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在方法执行之后进行逻辑处理 System.out.println("拦截器postHandle方法执行"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图渲染完成后进行逻辑处理 System.out.println("拦截器afterCompletion方法执行"); } }
Dalam kod di atas, kami melaksanakan antara muka HandlerInterceptor dan mengatasi tiga kaedahnya. Dalam kaedah preHandle, kita boleh melakukan beberapa pra-pemprosesan dalam kaedah postHandle, kita boleh mengubah suai dan meningkatkan ModelAndView dalam kaedah afterCompletion, kita boleh melakukan beberapa operasi pembersihan sumber;
Seterusnya, kita perlu mengkonfigurasi pemintas tersuai ke dalam bekas Spring. Ini boleh dicapai melalui konfigurasi atau anotasi XML.
Tambah konfigurasi berikut dalam fail konfigurasi Spring:
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <mvc:exclude-mapping path="/login" /> <bean class="com.example.MyInterceptor" /> </mvc:interceptor> </mvc:interceptors>
Dalam konfigurasi di atas, kami menggunakan tag <mvc:interceptor>
untuk mentakrifkan pemintas, dan lulus < Teg kod><mvc:mapping> menentukan laluan URL untuk dipintas. Gunakan teg <mvc:exclude-mapping>
untuk mengecualikan beberapa laluan URL yang tidak perlu dipintas. <mvc:interceptor>
标签来定义拦截器,并通过<mvc:mapping>
标签指定要拦截的URL路径。使用<mvc:exclude-mapping>
标签来排除一些不需要拦截的URL路径。
在拦截器类上添加@Component
注解,并使用@Order
@Component
pada kelas pemintas dan gunakan anotasi @Order
untuk menentukan susunan pelaksanaan pemintas. @Component @Order(1) public class MyInterceptor implements HandlerInterceptor { // 省略代码 }
@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/login"); } }
Atas ialah kandungan terperinci Terokai prinsip pelaksanaan pemintas Spring. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!