Rumah  >  Artikel  >  Java  >  Cara menggunakan pemintas SpringBoot

Cara menggunakan pemintas SpringBoot

王林
王林ke hadapan
2023-05-16 13:01:061717semak imbas

Penjelasan terperinci mengenai HandlerInterceptor

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:

Cara menggunakan pemintas SpringBoot

praHandle

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

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

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();
}

Daftar pemintas

Perhatikan bahawa pemintas tersuai kami mesti didaftarkan melalui kelas pelaksanaan WebMvcConfigurer untuk berkuat kuasa.

rreeee

Atas ialah kandungan terperinci Cara menggunakan pemintas SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam