最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 攔截器實(shí)戰(zhàn)指南之登錄驗證、日志記錄、權(quán)限控制

 更新時間:2026年03月16日 17:14:33   作者:crud  
本文詳細(xì)介紹了SpringBoot攔截器的使用方法,通過多個實(shí)戰(zhàn)案例,展示了攔截器在登錄鑒權(quán)、請求日志記錄、接口權(quán)限控制和防止重復(fù)提交等方面的應(yīng)用,幫助開發(fā)者更好地理解和掌握SpringBoot攔截器的使用技巧,感興趣的朋友跟隨小編一起看看吧

在 Web 開發(fā)中,我們經(jīng)常需要對請求進(jìn)行統(tǒng)一處理,比如:

  • 判斷用戶是否已登錄
  • 記錄請求日志
  • 實(shí)現(xiàn)接口權(quán)限校驗
  • 防止重復(fù)提交
  • 統(tǒng)一設(shè)置響應(yīng)頭信息

這些功能如果都寫在每個 Controller 里,不僅代碼冗余,還難以維護(hù)。而 Spring Boot 提供了強(qiáng)大的攔截器(Interceptor)機(jī)制,讓我們可以像 AOP 一樣,在請求到達(dá) Controller 之前或之后進(jìn)行統(tǒng)一處理。

本文將帶你從零開始掌握 Spring Boot 攔截器的使用,并通過多個實(shí)用案例展示其強(qiáng)大之處!

?? 一、什么是 Spring Boot 攔截器?

? 定義:

攔截器(HandlerInterceptor)是 Spring MVC 提供的一種用于攔截 HTTP 請求的機(jī)制。它可以在請求被 Controller 處理前后執(zhí)行特定邏輯。

? 與 Filter 的區(qū)別:

對比項Interceptor(攔截器)Filter(過濾器)
所屬框架Spring MVCServlet 標(biāo)準(zhǔn)
精確度可以精確到 Controller 方法級別作用于所有請求
支持 Spring 注入? 支持? 不支持
執(zhí)行時機(jī)preHandle -> Controller -> postHandle -> afterCompletiondoFilter

?? 適用場景:

  • 登錄狀態(tài)校驗
  • 接口權(quán)限控制
  • 請求日志記錄
  • 統(tǒng)一返回格式封裝
  • 防止重復(fù)提交

??? 二、自定義攔截器實(shí)現(xiàn)步驟

Step 1:創(chuàng)建攔截器類

實(shí)現(xiàn) HandlerInterceptor 接口,并重寫以下三個方法:

public class LoginInterceptor implements HandlerInterceptor {
    // 請求進(jìn)入 Controller 之前執(zhí)行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (token == null || !token.equals("abc123")) {
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write("{\"code\":401,\"message\":\"未登錄\"}");
            return false; // 中斷請求
        }
        return true;
    }
    // Controller 方法執(zhí)行完成后執(zhí)行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 可選操作,如添加響應(yīng)頭
        response.setHeader("X-Custom-Header", "interceptor-added");
    }
    // 整個請求完成(包括視圖渲染)后執(zhí)行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 可用于資源清理、日志記錄等
        System.out.println("【攔截器】請求結(jié)束:" + request.getRequestURI());
    }
}

Step 2:注冊攔截器

創(chuàng)建配置類,繼承 WebMvcConfigurer 并重寫 addInterceptors() 方法:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")         // 攔截所有路徑
                .excludePathPatterns("/login", "/error"); // 排除不需要攔截的路徑
    }
}

?? 三、攔截器典型應(yīng)用場景實(shí)戰(zhàn)

? 場景一:登錄鑒權(quán)(Token 校驗)

攔截所有非登錄請求,判斷請求頭中是否攜帶有效 Token。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String token = request.getHeader("Authorization");
    if (token == null || !isValidToken(token)) {
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        return false;
    }
    return true;
}

? 場景二:請求日志記錄

記錄每次請求的 URL、IP、耗時、參數(shù)等信息。

private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    startTimeThreadLocal.set(System.currentTimeMillis());
    System.out.println("【請求開始】IP: " + request.getRemoteAddr() + ", URI: " + request.getRequestURI());
    return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    long duration = System.currentTimeMillis() - startTimeThreadLocal.get();
    System.out.println("【請求結(jié)束】耗時: " + duration + "ms");
    startTimeThreadLocal.remove();
}

? 場景三:接口權(quán)限控制(基于角色)

根據(jù)當(dāng)前用戶的角色判斷是否有權(quán)限訪問某個接口。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    User user = getCurrentUser(request);
    if (!user.hasPermission(request.getRequestURI())) {
        response.getWriter().write("{\"code\":403,\"message\":\"無權(quán)限\"}");
        return false;
    }
    return true;
}

? 場景四:防止重復(fù)提交

通過 Token 或 Redis 緩存來識別重復(fù)請求。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String token = request.getParameter("formToken");
    if (StringUtils.isEmpty(token) || RedisUtil.exists(token)) {
        response.getWriter().write("{\"code\":400,\"message\":\"請勿重復(fù)提交\"}");
        return false;
    }
    RedisUtil.set(token, "submitted", 60); // 設(shè)置有效期
    return true;
}

?? 四、攔截器使用注意事項

注意事項說明
攔截器順序問題多個攔截器按照注冊順序依次執(zhí)行 preHandle,逆序執(zhí)行 afterCompletion
不要阻塞主線程如需異步處理,請使用線程池
避免頻繁調(diào)用耗時操作如數(shù)據(jù)庫查詢、遠(yuǎn)程調(diào)用等,可能影響性能
使用 ThreadLocal 要注意內(nèi)存泄漏每次請求結(jié)束后記得 remove 清理
不建議替代 Filter如跨域、編碼處理等仍推薦使用 Filter

?? 五、總結(jié)對比表

功能說明
preHandle在 Controller 執(zhí)行前調(diào)用,可中斷請求
postHandle在 Controller 執(zhí)行后、視圖渲染前調(diào)用
afterCompletion請求完全結(jié)束后調(diào)用,可用于資源釋放
應(yīng)用場景登錄校驗、權(quán)限控制、日志記錄、防重提交
優(yōu)點(diǎn)解耦業(yè)務(wù)邏輯、統(tǒng)一處理請求
缺點(diǎn)濫用會影響性能、增加系統(tǒng)復(fù)雜度

?? 六、結(jié)語

Spring Boot 攔截器是構(gòu)建高質(zhì)量 Web 應(yīng)用不可或缺的利器之一。通過合理使用攔截器,我們可以優(yōu)雅地實(shí)現(xiàn)登錄驗證、權(quán)限控制、日志記錄等通用功能,使代碼更簡潔、系統(tǒng)更健壯。

無論你是開發(fā)企業(yè)級后臺管理系統(tǒng),還是搭建高并發(fā) API 接口平臺,都應(yīng)該掌握攔截器的使用技巧。

到此這篇關(guān)于Spring Boot 攔截器實(shí)戰(zhàn)指南之登錄驗證、日志記錄、權(quán)限控制的文章就介紹到這了,更多相關(guān)Spring Boot 攔截器實(shí)戰(zhàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java設(shè)計模式之單例模式

    詳解Java設(shè)計模式之單例模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計模式之單例模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java基于GUI實(shí)現(xiàn)簡單畫筆小畫板

    java基于GUI實(shí)現(xiàn)簡單畫筆小畫板

    這篇文章主要為大家詳細(xì)介紹了java基于GUI實(shí)現(xiàn)簡單畫筆小畫板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java變量的聲明與賦值分離規(guī)范示例

    java變量的聲明與賦值分離規(guī)范示例

    這篇文章主要為大家介紹了java變量的聲明與賦值分離規(guī)范示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Springboot注入帶參數(shù)的構(gòu)造函數(shù)實(shí)例

    使用Springboot注入帶參數(shù)的構(gòu)造函數(shù)實(shí)例

    這篇文章主要介紹了使用Springboot注入帶參數(shù)的構(gòu)造函數(shù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 簡單說說JVM堆區(qū)的相關(guān)知識

    簡單說說JVM堆區(qū)的相關(guān)知識

    今天給大家?guī)淼氖顷P(guān)于Java虛擬機(jī)的相關(guān)知識,文章圍繞著JVM堆區(qū)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 以銀行取錢為例模擬Java多線程同步問題完整代碼

    以銀行取錢為例模擬Java多線程同步問題完整代碼

    這篇文章主要介紹了以銀行取錢為例模擬Java多線程同步問題完整代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • 淺談一下Spring的核心基礎(chǔ)IOC與DI

    淺談一下Spring的核心基礎(chǔ)IOC與DI

    這篇文章主要介紹了Spring的核心基礎(chǔ)IOC與DI的詳細(xì)用法,spring技術(shù)是現(xiàn)在企業(yè)開發(fā)中幾乎必備的技術(shù)選型,那么學(xué)好spring就很重要,本篇著重講解spring的核心機(jī)制,IOD與DI,一起來看看吧
    2023-03-03
  • EasyExcel自定義下拉注解的三種實(shí)現(xiàn)方式總結(jié)

    EasyExcel自定義下拉注解的三種實(shí)現(xiàn)方式總結(jié)

    使用EasyExcel設(shè)置下拉數(shù)據(jù)時,每次都要創(chuàng)建一個SheetWriteHandler組件確實(shí)比較繁瑣,為了優(yōu)化這個過程,我們可以通過自定義注解來簡化操作,下面就來看看具體實(shí)現(xiàn)方法吧
    2024-10-10
  • SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié)

    SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié)

    本文主要介紹了SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié),分別是InMemoryTokenStore,JdbcTokenStore,JwkTokenStore,RedisTokenStore,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Spring Boot系列教程之日志配置

    Spring Boot系列教程之日志配置

    這篇文章主要給大家介紹了關(guān)于Spring Boot系列教程之日志配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論

东至县| 长垣县| 竹山县| 萨嘎县| 新乐市| 锡林郭勒盟| 芜湖县| 雅安市| 廉江市| 闻喜县| 临朐县| 离岛区| 龙南县| 沁阳市| 山阳县| 安新县| 渭源县| 龙泉市| 荣成市| 色达县| 鸡东县| 濮阳县| 寿光市| 汶上县| 工布江达县| 金门县| 法库县| 沁水县| 崇州市| 宁河县| 肇东市| 万山特区| 百色市| 万山特区| 高阳县| 泰宁县| 伊川县| 上蔡县| 班戈县| 新绛县| 台安县|