springboot~攔截器的使用場景


在用戶登陸之后,我們一般會把用戶登陸的狀態和相關信息進行存儲,把對應的token返回到客戶端進行存儲,下次請求過來時,系統可以通過token拿到當前這個用戶的相關信息,這是授權通常的作法,而有時一些業務里,你存儲的用戶信息不是全局的,可能只是某幾個接口會用戶某些信息,而你把它存儲起來就不是很合理;並且一些隱私信息持久化到redis也不合理,這時就需要統一對這種接口的請求做一起處理了。

攔截器HandlerInterceptor

我們可以去實現這個HandlerInterceptor接口,它會把請求頁面前,請求頁面后等方法,我們可以重寫它們,把自己的邏輯加進來,比如我們可以在請求頁面前,通過當前登陸人ID獲取到當前登陸人能看的信息ID集合,並把這些ID集合以參數的形式傳到這個頁面里,這個過程是在服務端自動完成的,即對某個頁面(接口)進行攔截,添加自己的邏輯。

/**
 * 當前用戶的數據權限.
 */
@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;
    }
}

注冊這個攔截器

/**
 * 注冊攔截器
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 自定義攔截器,添加攔截路徑和排除攔截路徑
        registry.addInterceptor(new DataPermissionInterceptor()).addPathPatterns("/approve/**");
    }
}

在對應的頁面(接口)里讀取在攔截器里賦值的對象,就可以進行剩下的工作了。
應用層代碼
通過這個例子我們了解到,對一些具有統一操作的動作,我們可以把它提取到攔截器里去完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM