中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot攔截器怎么用

發布時間:2022-04-02 15:55:30 來源:億速云 閱讀:121 作者:iii 欄目:移動開發

今天小編給大家分享一下SpringBoot攔截器怎么用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

HandlerInterceptor 詳解

HandlerInterceptor 允許定制 handler 處理器執行鏈的工作流接口。我們可以自定義攔截器用于攔截 handlers 處理器(你可以理解為 controller 層的接口),從而可以添加一些共同的重復性的處理行為(例如接口鑒權,接口日志記錄,性能監控等),而不用修改每一個 handler 的實現。

注意,此基于 SpringBoot 2.3.12.RELEASE 版本講解。

HandlerInterceptor 接口只有三個默認空實現方法,在低版本中這三個方法不是默認方法,而是抽象方法。

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 {
	}
}

這三個方法的執行順序圖如下:

SpringBoot攔截器怎么用

preHandle

preHandle 前置處理,攔截一個處理器(handler)的執行,preHandle 方法會在 HandlerMapping 確定一個適當的處理器對象之后,但在 HandlerAdapter 調用處理器之前被調用。可以簡單理解為 controller 接口被調用之前執行。

Intercepter 是鏈式的,就是一個接著一個執行。如果此方法返回 true,則會執行下一個攔截器或者直接執行處理器。如果此方法返回 false 或者拋出異常則終止執行鏈,也不再調用處理器。

注意,此方法如果不返回 true,那么 postHandle 和 afterCompletion 不會被執行。

那這個方法有什么用呢?其實可以做一些接口被調用前的預處理,例如用戶權限校驗。

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 后置處理,會在 HandlerAdapter 調用處理器之后,但在 DispatcherServlet 渲染視圖之前被調用。可以在此對 ModelAndView 做一些額外的處理。可以簡單理解為 controller 接口被調用之后執行。

注意,此方法在執行鏈中的執行順序是倒著執行的,即先聲明的攔截器后執行。

afterCompletion

afterCompletion 完成之后,在請求處理完之后被執行,也就是渲染完視圖之后。一般用于做一些資源的清理工作,配合 preHandle 計算接口執行時間等。

注意,和 postHandle 一樣,此方法在執行鏈中的執行順序也是倒著執行的,即先聲明的攔截器后執行。

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                            Object handler, @Nullable Exception ex) {
    // 請求完后,清除當前線程的用戶信息
    UserContextHolder.removeUserContext();
}

注冊攔截器

注意,我們自定義的攔截器要通過 WebMvcConfigurer 的實現類進行注冊,才能生效。

package com.yzj.ehr.common.config;

import com.yzj.ehr.common.context.UserContextResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.yzj.ehr.common.interceptor.UserPermissionInterceptor;

/**
 * @Description 注冊攔截器
 * @Author 陳皮
 * @Date 2021/6/27
 * @Version 1.0
 */
@Component
public class WebAppConfigurer implements WebMvcConfigurer {

    private UserPermissionInterceptor userPermissionInterceptor;

    public WebAppConfigurer(final UserPermissionInterceptor userPermissionInterceptor) {
        this.userPermissionInterceptor = userPermissionInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 匹配所有接口,排除/base/test接口
        registry.addInterceptor(userPermissionInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/base/test");
    }
}

以上就是“SpringBoot攔截器怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大冶市| 烟台市| 乡宁县| 右玉县| 鸡东县| 河东区| 水城县| 林州市| 阿尔山市| 彭山县| 昭平县| 祁门县| 平罗县| 龙游县| 巫溪县| 吉林省| 小金县| 丹江口市| 吴旗县| 宜川县| 彭州市| 扎赉特旗| 通化县| 天长市| 青州市| 北票市| 宜黄县| 新郑市| 正镶白旗| 花莲县| 宣化县| 高平市| 安宁市| 仙桃市| 无锡市| 游戏| 河池市| 通榆县| 巢湖市| 乐业县| 寻甸|