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

SpringBoot攔截器(Interceptor)自定義實現(xiàn)登錄鑒權(quán)功能

 更新時間:2026年03月31日 09:27:46   作者:希望永不加班  
在 Web 項目中,登錄鑒權(quán)是最核心的安全機制,SpringBoot 提供的?HandlerInterceptor 攔截器,是實現(xiàn)登錄校驗、日志記錄、接口限流最優(yōu)雅的方案,本篇文章將介紹原理、自定義攔截器、登錄校驗實戰(zhàn)、放行白名單、全局異常處理,需要的朋友可以參考下

引言

在 Web 項目中,登錄鑒權(quán)是最核心的安全機制:
接口必須校驗用戶是否登錄、是否擁有權(quán)限,未登錄則直接攔截,禁止訪問。

SpringBoot 提供的 HandlerInterceptor 攔截器,是實現(xiàn)登錄校驗、日志記錄、接口限流最優(yōu)雅的方案。

本篇文章將介紹原理、自定義攔截器、登錄校驗實戰(zhàn)、放行白名單、全局異常處理。

一、什么是攔截器?作用是什么?

攔截器(Interceptor):在請求進(jìn)入 Controller 之前/之后/渲染完成 進(jìn)行攔截處理。

核心用途:

  1. 登錄狀態(tài)校驗
  2. 權(quán)限校驗
  3. 接口日志記錄
  4. 防重復(fù)提交
  5. 性能監(jiān)控

特點:

  • 只攔截 Controller 請求
  • 不攔截靜態(tài)資源(可配置)
  • 可中斷請求,直接返回結(jié)果
  • 全局統(tǒng)一控制,代碼干凈

二、攔截器核心 API

實現(xiàn) HandlerInterceptor 接口,重寫 3 個方法:

publicinterfaceHandlerInterceptor{
// 1. 請求進(jìn)入Controller之前執(zhí)行(鑒權(quán)寫這里)
defaultbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{
returntrue;// true=放行 false=攔截
}
// 2. Controller執(zhí)行完畢,渲染頁面之前執(zhí)行
defaultvoidpostHandle(...)throwsException{}
// 3. 整個請求完全結(jié)束后執(zhí)行(清理資源)
defaultvoidafterCompletion(...)throwsException{}
}

登錄鑒權(quán)只需要 preHandle

三、自定義登錄攔截器

創(chuàng)建 LoginInterceptor.java

importlombok.extern.slf4j.Slf4j;
importorg.springframework.web.servlet.HandlerInterceptor;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* 登錄攔截器:校驗是否登錄
*/
@Slf4j
publicclassLoginInterceptorimplementsHandlerInterceptor{
// 進(jìn)入Controller前執(zhí)行:核心校驗邏輯
@Override
publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{
// 1. 獲取前端傳遞的 Token / Session
String token = request.getHeader("token");
        log.info("當(dāng)前請求token:{}", token);
// 2. 判斷是否登錄(真實項目:查詢Redis/數(shù)據(jù)庫)
if(token ==null|| token.isEmpty()){
            log.error("用戶未登錄,請求被攔截");
// 攔截,返回未登錄提示
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write("{\"code\":401,\"msg\":\"未登錄,請先登錄\",\"data\":null}");
returnfalse;
}
// 3. 登錄有效,放行
returntrue;
}
}

四、注冊攔截器 + 配置白名單

創(chuàng)建 WebConfig.java
實現(xiàn) WebMvcConfigurer,注冊攔截器并設(shè)置放行接口(登錄、注冊、放行接口)。

importorg.springframework.context.annotation.Configuration;
importorg.springframework.web.servlet.config.annotation.InterceptorRegistry;
importorg.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
*Web 配置:注冊攔截器
*/
@Configuration
publicclassWebConfigimplementsWebMvcConfigurer{
@Override
publicvoidaddInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(newLoginInterceptor())
.addPathPatterns("/**")// 攔截所有請求
.excludePathPatterns(// 放行白名單
"/user/login",// 登錄接口
"/user/register",// 注冊接口
"/swagger/**",// 接口文檔
"/v3/api-docs/**"
);
}
}

配置完成,所有接口都會自動校驗登錄

五、配合統(tǒng)一返回結(jié)構(gòu)

攔截器中直接返回 Result 格式

response.setContentType("application/json;charset=utf-8");
Result result =Result.fail(401,"未登錄,請先登錄");
response.getWriter().write(newObjectMapper().writeValueAsString(result));
returnfalse;

返回格式:

{
"code":401,
"msg":"未登錄,請先登錄",
"data":null
}

六、登錄校驗邏輯

真實項目中,登錄邏輯一般是:

  1. 前端登錄成功,后端生成 Token
  2. Token 存入 Redis(設(shè)置過期時間)
  3. 前端每次請求在 請求頭 header 攜帶 token
  4. 攔截器獲取 token,查詢 Redis 是否有效
  5. 有效放行,無效攔截

完整版攔截器

1@Slf4j
2publicclassLoginInterceptorimplementsHandlerInterceptor{
3
4@Autowired
5privateRedisTemplate<String,Object> redisTemplate;
6
7@Override
8publicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{
9String token = request.getHeader("token");
10
11// 1. 無token
12if(token ==null|| token.isBlank()){
13returnresponseFail(response,"未登錄,請先登錄");
14}
15
16// 2. 校驗Redis
17Object user = redisTemplate.opsForValue().get("login:token:"+ token);
18if(user ==null){
19returnresponseFail(response,"登錄已過期,請重新登錄");
20}
21
22// 3. 放行
23returntrue;
24}
25
26// 統(tǒng)一返回錯誤
27privatebooleanresponseFail(HttpServletResponse response,String msg)throwsException{
28        response.setContentType("application/json;charset=utf-8");
29Result<?> result =Result.fail(401, msg);
30        response.getWriter().write(newObjectMapper().writeValueAsString(result));
31returnfalse;
32}
33}

七、攔截器常見高級用法

1. 獲取當(dāng)前請求接口信息

HandlerMethod handlerMethod =(HandlerMethod) handler;
String methodName = handlerMethod.getMethod().getName();
String className = handlerMethod.getBean().getClass().getName();

2. 放行靜態(tài)資源

.excludePathPatterns("/static/**","/img/**","/css/**","/js/**")

3. 多攔截器順序

registry.addInterceptor(A).order(1);
registry.addInterceptor(B).order(2);

數(shù)字越小,越先執(zhí)行。

八、攔截器 VS 過濾器 Filter

組件技術(shù)作用范圍適用場景
攔截器 InterceptorSpring只攔截Controller登錄、權(quán)限、日志
過濾器 FilterServlet所有請求編碼、跨域、限流

登錄鑒權(quán)優(yōu)先用攔截器!

九、總結(jié)

  1. 實現(xiàn) HandlerInterceptor
  2. preHandle 寫登錄校驗
  3. WebConfig 注冊 + 白名單
  4. 返回 401 未登錄
  5. 配合 Redis 實現(xiàn)真實登錄鑒權(quán)

以上就是SpringBoot攔截器(Interceptor)自定義實現(xiàn)登錄鑒權(quán)功能的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot攔截器實現(xiàn)登錄鑒權(quán)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案)

    Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案)

    Seata 是一款開源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡單易用的分布式事務(wù)服務(wù),這篇文章主要介紹了Spring?Cloud?+?Nacos?+?Seata整合過程(分布式事務(wù)解決方案),需要的朋友可以參考下
    2022-03-03
  • SpringBoot簡單整合ElasticSearch實踐

    SpringBoot簡單整合ElasticSearch實踐

    Elasticsearch支持結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)檢索,通過索引創(chuàng)建和倒排索引文檔,提高搜索效率,它基于Lucene封裝,分為索引庫、類型、文檔和字段,Spring Boot可方便操作ES,通過依賴配置、實體類映射和ElasticsearchRepository接口實現(xiàn)CRUD操作
    2025-12-12
  • Java枚舉(Enum)從基礎(chǔ)到高級應(yīng)用詳解

    Java枚舉(Enum)從基礎(chǔ)到高級應(yīng)用詳解

    文章詳細(xì)介紹了Java枚舉(enum)的概念、基礎(chǔ)語法、內(nèi)置方法及高級用法,強調(diào)了枚舉在提高代碼類型安全性、可讀性和維護(hù)性方面的優(yōu)勢,文中還列舉了添加字段、方法和實現(xiàn)接口等高級用法,并提供了命名規(guī)范、不可變性、異常處理等最佳實踐建議,需要的朋友可以參考下
    2026-05-05
  • java明文密碼三重加密方法

    java明文密碼三重加密方法

    這篇文章主要介紹了java明文密碼加密,對一個明文密碼進(jìn)行了三重加密:第一層?xùn)艡谝淮危诙釉跂艡谝淮?,第三層在一次摩斯加密,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java使用PDFBox處理PDF的完全指南

    Java使用PDFBox處理PDF的完全指南

    在日常開發(fā)中,我們可能會遇到PDF的處理,如PDF的內(nèi)容提取、分割、合并等操作,本文就來和大家介紹一個Apache出品的工具PDFBox,完美解決PDF的解析生成與操作難題,下面我們就來看看具體使用吧
    2025-07-07
  • 細(xì)說Springcloud eureka的幾種主動下線服務(wù)的方式

    細(xì)說Springcloud eureka的幾種主動下線服務(wù)的方式

    這篇文章主要介紹了細(xì)說Springcloud eureka的幾種主動下線服務(wù)的方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • 詳解Spring Boot配置文件之多環(huán)境配置

    詳解Spring Boot配置文件之多環(huán)境配置

    本篇文章主要介紹了詳解Spring Boot配置文件之多環(huán)境配置 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • springboot 多數(shù)據(jù)源的實現(xiàn)(最簡單的整合方式)

    springboot 多數(shù)據(jù)源的實現(xiàn)(最簡單的整合方式)

    這篇文章主要介紹了springboot 多數(shù)據(jù)源的實現(xiàn)(最簡單的整合方式),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Springboot如何通過自定義工具類獲取bean

    Springboot如何通過自定義工具類獲取bean

    這篇文章主要介紹了Springboot通過自定義工具類獲取bean方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java7之forkjoin簡介_動力節(jié)點Java學(xué)院整理

    Java7之forkjoin簡介_動力節(jié)點Java學(xué)院整理

    Java7引入了Fork Join的概念,來更好的支持并行運算。接下來通過本文給大家分享Java7之forkjoin簡介,感興趣的朋友一起看看吧
    2017-06-06

最新評論

台南市| 丰城市| 周宁县| 永川市| 西藏| 霍山县| 阳谷县| 江城| 饶阳县| 精河县| 格尔木市| 黎川县| 余江县| 富阳市| 辛集市| 宁陕县| 镇平县| 武清区| 南充市| 阿荣旗| 德保县| 辛集市| 新余市| 高台县| 那坡县| 安溪县| 体育| 若羌县| 改则县| 象山县| 河北区| 图片| 尉氏县| 新乡市| 福鼎市| 马尔康县| 原平市| 延吉市| 建湖县| 乳源| 沅江市|