在用戶登錄以後,咱們通常會把用戶登錄的狀態和相關信息進行存儲,把對應的token返回到客戶端進行存儲,下次請求過來時,系統能夠經過token拿到當前這個用戶的相關信息,這是受權一般的做法,而有時一些業務裏,你存儲的用戶信息不是全局的,可能只是某幾個接口會用戶某些信息,而你把它存儲起來就不是很合理;而且一些隱私信息持久化到redis也不合理,這時就須要統一對這種接口的請求作一塊兒處理了。html
咱們能夠去實現這個HandlerInterceptor接口,它會把請求頁面前,請求頁面後等方法,咱們能夠重寫它們,把本身的邏輯加進來,好比咱們能夠在請求頁面前,經過當前登錄人ID獲取到當前登錄人能看的信息ID集合,並把這些ID集合以參數的形式傳到這個頁面裏,這個過程是在服務端自動完成的,即對某個頁面(接口)進行攔截,添加本身的邏輯。redis
/** * 當前用戶的數據權限. */ @Slf4j public class DataPermissionInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("DataPermissionInterceptor.init"); //業務邏輯,可能判斷當前登錄人存儲的數據權限類型,而後統一處理,拿到能夠訪問的數據編號集合 String[] ids = {"1", "2", "3"}; request.setAttribute("approveIds", StringUtils.join(ids, ",")); return true; } } 複製代碼
註冊這個攔截器bash
/** * 註冊攔截器 */ @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 自定義攔截器,添加攔截路徑和排除攔截路徑 registry.addInterceptor(new DataPermissionInterceptor()).addPathPatterns("/approve/**"); } } 複製代碼
在對應的頁面(接口)裏讀取在攔截器裏賦值的對象,就能夠進行剩下的工做了。 markdown
經過這個例子咱們瞭解到,對一些具備統一操做的動做,咱們能夠把它提取到攔截器裏去完成。app
轉載至→ 原文做者:張佔嶺 原文連接:www.cnblogs.com/lori/p/1298…ide