HandlerInterceptor
membenarkan penyesuaian antara muka aliran kerja handler
rantai pelaksanaan pemproses. Kami boleh menyesuaikan pemintas untuk memintas pemproses pengendali (anda boleh memahaminya sebagai antara muka lapisan pengawal), supaya kami boleh menambah beberapa tingkah laku pemprosesan berulang yang biasa (seperti pengesahan antara muka, pengelogan antara muka, pemantauan prestasi, dll.) tanpa Ubah suai pelaksanaan setiap pengendali.
Perhatikan bahawa ini adalah berdasarkan versi SpringBoot 2.3.12.RELEASE
.
Antara muka HandlerInterceptor hanya mempunyai tiga kaedah pelaksanaan kosong lalai Dalam versi yang lebih rendah, ketiga-tiga kaedah ini bukan kaedah lalai, tetapi kaedah abstrak.
public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
Rajah jujukan pelaksanaan ketiga-tiga kaedah ini adalah seperti berikut:
preHandle
Pra-pemprosesan, memintas a pelaksanaan pemproses (pengendali), kaedah praHandle akan dipanggil selepas HandlerMapping
menentukan objek pengendali yang sesuai, tetapi sebelum HandlerAdapter
memanggil pengendali. Ia boleh difahami dengan mudah bahawa antara muka pengawal dilaksanakan sebelum ia dipanggil.
Pemintas dirantai, iaitu, dilaksanakan satu demi satu. Jika kaedah ini kembali benar, pemintas atau pengendali seterusnya dilaksanakan secara langsung. Jika kaedah ini mengembalikan palsu atau membuang pengecualian, rantai pelaksanaan ditamatkan dan pengendali tidak lagi dipanggil.
Perhatikan bahawa jika kaedah ini tidak kembali benar, maka postHandle
dan afterCompletion
tidak akan dilaksanakan.
Lalu apakah kegunaan kaedah ini? Malah, anda boleh melakukan beberapa prapemprosesan sebelum antara muka dipanggil, seperti pengesahan kebenaran pengguna.
package com.chenpi; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; /** * @Description 用户权限验证拦截 * @Author 陈皮 * @Date 2021/6/27 * @Version 1.0 */ @Component public class UserPermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; // 获取用户权限校验注解 UserAuthenticate userAuthenticate = handlerMethod.getMethod().getAnnotation(UserAuthenticate.class); if (null == userAuthenticate) { userAuthenticate = handlerMethod.getMethod().getDeclaringClass() .getAnnotation(UserAuthenticate.class); } if (userAuthenticate != null && userAuthenticate.permission()) { // 验证用户信息 UserContext userContext = userContextManager.getUserContext(request); if (null == userContext) { return false; } } } return true; } }
postHandle
pasca pemprosesan akan dipanggil selepas HandlerAdapter
memanggil pengendali tetapi sebelum DispatcherServlet
memaparkan paparan. Anda boleh melakukan beberapa pemprosesan tambahan pada ModelAndView
di sini. Ia boleh difahami dengan mudah bahawa ia dilaksanakan selepas antara muka pengawal dipanggil.
Perhatikan bahawa susunan pelaksanaan kaedah ini dalam rantaian pelaksanaan diterbalikkan, iaitu, pemintas yang diisytiharkan dahulu akan dilaksanakan kemudian.
afterCompletion dilaksanakan selepas permintaan diproses, iaitu selepas paparan diberikan. Ia biasanya digunakan untuk membersihkan beberapa sumber dan bekerjasama dengan preHandle untuk mengira masa pelaksanaan antara muka, dsb.
Perhatikan bahawa, seperti postHandle, susunan pelaksanaan kaedah ini dalam rantai pelaksanaan juga diterbalikkan, iaitu, pemintas yang diisytiharkan dahulu dilaksanakan kemudian.
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) { // 请求完后,清除当前线程的用户信息 UserContextHolder.removeUserContext(); }
Perhatikan bahawa pemintas tersuai kami mesti didaftarkan melalui kelas pelaksanaan WebMvcConfigurer
untuk berkuat kuasa.
Atas ialah kandungan terperinci Cara menggunakan pemintas SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!