Java后端接口調用攔截處理:注解與攔截器的實現

在Java開發中,對后端接口調用進行攔截處理是一種常見的需求,通常用于權限驗證、Token校驗、狀態更新等操作。本文將圍繞 Spring框架的攔截器(Interceptor)Spring AOP(面向切面編程)Spring Security 三種實現方式,結合注解的應用,詳細講解如何設計和實現接口攔截邏輯。


一、基于Spring框架的攔截器(Interceptor)

1. 攔截器簡介

攔截器(Interceptor)是Spring MVC框架提供的功能,能夠在請求到達控制器之前或之后執行特定邏輯。它適合用于全局范圍的攔截操作,例如統一的日志記錄、Token校驗、權限驗證等。

2. 實現步驟

(1)創建自定義攔截器

通過實現 HandlerInterceptor 接口,可以定義攔截器的具體邏輯。以下是代碼示例:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class TokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 獲取請求頭中的TokenString token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("Missing token");return false; // 阻止請求繼續執行}// 校驗Token有效性if (!validateToken(token)) {response.setStatus(HttpServletResponse.SC_FORBIDDEN);response.getWriter().write("Invalid or expired token");return false; // 阻止請求繼續執行}// 更新Token狀態updateTokenStatus(token);return true; // 放行請求}private boolean validateToken(String token) {// 簡單模擬Token校驗邏輯return token.startsWith("valid_");}private void updateTokenStatus(String token) {// 模擬更新Token狀態System.out.println("Token updated: " + token);}
}
(2)注冊攔截器

在Spring配置類中,通過實現 WebMvcConfigurer 接口,將自定義攔截器注冊到應用中,并指定攔截規則:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate TokenInterceptor tokenInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 攔截所有路徑,但排除登錄和注冊接口registry.addInterceptor(tokenInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register");}
}
(3)測試效果
  • 當用戶訪問受保護的接口時,攔截器會先檢查Token。
  • 如果Token無效或缺失,直接返回錯誤響應。
  • 如果Token有效,則更新狀態并放行請求。

3. 適用場景

攔截器適合全局范圍的攔截需求,例如統一的日志記錄、Token校驗、權限驗證等。


二、基于Spring AOP的細粒度控制

1. Spring AOP簡介

Spring AOP(Aspect-Oriented Programming)是一種面向切面編程的技術,允許開發者在不修改業務代碼的情況下,動態地插入邏輯。它適合需要對某些特定方法進行攔截的場景。

2. 實現步驟

(1)定義自定義注解

創建一個注解,用于標記需要攔截的方法:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckToken {
}
(2)創建切面類

使用AOP切面,在方法執行前進行Token校驗:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Aspect
@Component
public class TokenAspect {private final HttpServletRequest request;public TokenAspect(HttpServletRequest request) {this.request = request;}// 定義切入點:所有被@CheckToken注解的方法@Pointcut("@annotation(CheckToken)")public void checkTokenPointcut() {}// 在方法執行前進行攔截@Before("checkTokenPointcut()")public void checkToken() {String token = request.getHeader("Authorization");if (token == null || token.isEmpty()) {throw new RuntimeException("Missing token");}if (!validateToken(token)) {throw new RuntimeException("Invalid or expired token");}updateTokenStatus(token);}private boolean validateToken(String token) {return token.startsWith("valid_");}private void updateTokenStatus(String token) {System.out.println("Token updated: " + token);}
}
(3)在控制器中使用注解

在需要攔截的方法上添加 @CheckToken 注解:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@GetMapping("/profile")@CheckTokenpublic String getProfile() {return "User Profile";}
}
(4)測試效果
  • 訪問 /profile 時,AOP會自動攔截并校驗Token。
  • 如果Token無效或缺失,拋出異常,阻止方法執行。

3. 適用場景

AOP適合細粒度的控制,例如僅對某些特定方法進行攔截,靈活性高但稍顯復雜。


三、基于Spring Security的權限管理

1. Spring Security簡介

Spring Security是一個強大的安全框架,提供了全面的身份驗證和授權功能。如果項目中已經集成了Spring Security,可以通過自定義過濾器或配置來實現接口攔截。

2. 實現步驟

(1)創建自定義過濾器

繼承 OncePerRequestFilter,并在其中實現Token校驗邏輯:

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
public class JwtTokenFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String token = request.getHeader("Authorization");if (token == null || !validateToken(token)) {response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.getWriter().write("Invalid token");return;}updateTokenStatus(token);// 設置認證信息到SecurityContextSecurityContextHolder.getContext().setAuthentication(new CustomAuthentication(token));filterChain.doFilter(request, response);}private boolean validateToken(String token) {return token.startsWith("valid_");}private void updateTokenStatus(String token) {System.out.println("Token updated: " + token);}
}
(2)注冊過濾器

在Spring Security配置中添加自定義過濾器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
public class SecurityConfig {private final JwtTokenFilter jwtTokenFilter;public SecurityConfig(JwtTokenFilter jwtTokenFilter) {this.jwtTokenFilter = jwtTokenFilter;}@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/login", "/register").permitAll().anyRequest().authenticated().and().addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class);return http.build();}
}
(3)測試效果
  • Spring Security會在每次請求時調用自定義過濾器。
  • 如果Token無效或缺失,直接返回未授權響應。

3. 適用場景

Spring Security適合復雜的權限管理場景,集成度高,但學習成本較高。


四、總結

方案特點適用場景
攔截器全局攔截,簡單易用,適合統一的日志記錄、Token校驗、權限驗證等操作大多數基礎攔截需求
AOP細粒度控制,靈活但稍顯復雜僅對某些特定方法進行攔截
Spring Security功能強大,支持復雜的權限管理復雜的安全性需求

根據項目需求選擇合適的方案:

  • 如果只是簡單的Token校驗,推薦使用攔截器;
  • 如果需要更復雜的權限管理,建議使用Spring Security;
  • 如果需要細粒度的控制,可以選擇Spring AOP。

通過以上三種方式,你可以輕松實現對后端接口調用的攔截處理,從而提升系統的安全性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78762.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第14講:科研圖表的導出與排版藝術——高質量 PDF、TIFF 輸出與投稿規范全攻略!

目錄 ?? 前言:導出,不只是“保存”! ?? 一、你需要掌握的導出目標 ??? 二、TIFF / PNG 導出規范(適用于投稿) ?? 三、PDF 矢量圖導出(排版首選) ?? 四、強烈推薦組合:showtext + Cairo ?? 五、多個圖的組合導出技巧 ?? 六、特殊投稿需求處理 ?…

對 FormCalc 語言支持較好的 PDF 編輯軟件綜述

FormCalc是一種專為PDF表單計算設計的腳本語言,主要應用于Adobe生態及SAP相關工具。以下是對FormCalc支持較好的主流軟件及其特點: 1. Adobe LiveCycle Designer 作為FormCalc的原生開發環境,LiveCycle Designer提供最佳支持: …

第二階段:基礎加強階段總體介紹

Java語法的學習筆記 下面放復習的文檔鏈接,如果有需要可以前往下載獲取,這個倉庫還有關于mysql、hadoop、python等的復習部分,并且每個文檔有著對應的代碼部分。文章作為復習使用,更多代碼內容見鏈接如下: https://gitee.com/zha…

大前端開發——前端知識漸變分層講解 利用金字塔原理簡化前端知識體系

Web開發基礎 核心概念 HTML、CSS和JavaScript:Web開發的三大基石,分別負責結構、樣式和行為。 代碼管理:隨著項目規模擴大,需要將代碼拆分成小塊,便于維護。 作用域污染:早期所有代碼共享全局作用域&…

Mixture-of-Experts(MoE)原理與在DeepSeek中的應用

MoE機制簡介 Mixture-of-Experts(MoE,混合專家)是一種“分而治之”的神經網絡架構思想。在MoE模型中,存在多個并行的子網絡,被稱為“專家”。每個專家通常擅長處理特定類型的輸入特征或知識片段。而在模型前向計算時,并非激活所有專家參與運算,而是通過一個專門的門控網…

SpringCloud學習筆記

個人學習進度:視頻跟敲筆記(12天) 學習視頻:尚硅谷微服務速通(7小時左右課程) 資源: 1.pdf:微服務pdf(課程):https://pan.baidu.com/s/1g_TAuBjQ…

【大模型】Coze AI 智能體工作流從配置到使用實戰詳解

目錄 一、前言 二、工作流介紹 2.1 什么是工作流 2.2 工作流與對話流 2.2.1 兩者區別 2.3 工作流節點介紹 2.3.1 工作流節點說明 2.3.2 開始節點與結束節點 2.4 工作流入口 2.4.1 自定義智能體入口 2.4.2 從資源庫新增工作流 2.5 工作流使用限制 三、工作流配置與使…

Discord多賬號注冊登錄:如何同時管理多個賬戶?

Discord是許多人、特別是游戲玩家和社區管理者的重要溝通工具。隨著用戶需求的增長,越來越多的人開始在Discord上注冊多個賬號進行管理。例如,個人和工作賬號的區分,多個游戲社區的參與,或者通過不同的身份進行更靈活的社交互動。…

前端如何使用Mock模擬數據實現前后端并行開發,提升項目整體效率

1. 安裝 Mock.js npm install mockjs --save-dev # 或使用 CDN <script src"https://cdn.bootcdn.net/ajax/libs/Mock.js/1.0.0/mock-min.js"></script>2. 創建 Mock 數據文件 在項目中新建 mock 目錄&#xff0c;創建 mock.js 文件&#xff1a; // m…

AimRT 從零到一:官方示例精講 —— 二、HelloWorld示例.md

HelloWorld示例 官方倉庫&#xff1a;helloworld 配置文件&#xff08;configuration_helloworld.yaml? &#xff09; 依據官方示例項目結構自行編寫YAML配置文件 # 基礎信息 base_info:project_name: helloworld # 項目名稱build_mode_tags: ["EXAMPLE", &quo…

Tauri 跨平臺開發指南及實戰:用前端技術征服桌面應用(合集-萬字長文)

厭倦了笨重的Electron應用&#xff1f;想要構建體積小、性能高、安全可靠的跨平臺桌面應用&#xff1f;Tauri將是你的不二之選&#xff01;本教程帶你從入門到精通&#xff0c;掌握這個下一代桌面應用開發框架&#xff0c;并通過實戰APK分析工具項目&#xff0c;將理論知識轉化…

【LeetCode 熱題 100】矩陣置零 / 螺旋矩陣 / 旋轉圖像 / 搜索二維矩陣 II

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;LeetCode 熱題 100 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 矩陣矩陣置零螺旋矩陣旋轉圖像搜索二維矩陣 II 矩陣 矩陣置零 矩陣置零 用兩個數組分別標記行和列&#xff0c;判斷…

JavaScript進階(三十一): === 與 == 比較運算符

文章目錄 一、前言二、嚴格相等運算符 ()三、寬松相等運算符 ()四、推薦做法五、特殊情況 一、前言 在 JavaScript 中&#xff0c; 和 都是比較運算符&#xff0c;但它們在比較時有重要區別&#xff1a; 二、嚴格相等運算符 () 不進行類型轉換只有當兩個操作數的值和類型都…

HTML與安全性:XSS、防御與最佳實踐

HTML 與安全性&#xff1a;XSS、防御與最佳實踐 前言 現代 Web 應用程序無處不在&#xff0c;而 HTML 作為其基礎結構&#xff0c;承載著巨大的安全責任。跨站腳本攻擊&#xff08;XSS&#xff09;仍然是 OWASP Top 10 安全威脅之一&#xff0c;對用戶數據和網站完整性構成嚴…

安達發|破解醫療器械多BOM困局:APS生產計劃排產軟件解決方案

在醫療器械設備制造行業&#xff0c;生產計劃與排程&#xff08;Advanced Planning and Scheduling, APS&#xff09;系統的應用至關重要。由于醫療器械行業具有嚴格的法規要求&#xff08;如FDA、ISO 13485&#xff09;、復雜的多級BOM&#xff08;Bill of Materials&#xff…

組件輪播與樣式結構重用實驗

任務一&#xff1a;使用“Swiper 輪播組件”對自行選擇的圖片和文本素材分別進行輪播&#xff0c;且調整對應的“loop”、“autoPlay”“interval”、“vertical”屬性&#xff0c;實現不同的輪播效果&#xff0c;使用Swiper 樣式自定義&#xff0c;修改默認小圓點和被選中小圓…

【Stable Diffusion】文生圖進階指南:采樣器、噪聲調度與迭代步數的解析

在Stable Diffusion文生圖(Text-to-Image)的創作過程中,采樣器(Sampler)、噪聲調度器(Schedule type)和采樣迭代步數(Steps)是影響生成效果的核心參數。本文將從技術原理、參數優化到實踐應用,深入剖析DPM++ 2M采樣器、Automatic噪聲調度器以及采樣步數的設計邏輯與協…

第一天 車聯網定義、發展歷程與生態體系

前言 車聯網&#xff08;Internet of Vehicles, IoV&#xff09;作為物聯網&#xff08;IoT&#xff09;在汽車領域的延伸&#xff0c;正在徹底改變人們的出行方式。無論是自動駕駛、遠程診斷&#xff0c;還是實時交通優化&#xff0c;車聯網技術都扮演著核心角色。本文將從零…

foc控制 - clarke變換和park變換

1. foc控制框圖 下圖是foc控制框圖&#xff0c;本文主要是講解foc控制中的larke變換和park變換clarke變換將 靜止的 a b c abc abc坐標系 變換到 靜止的 α β αβ αβ坐標系&#xff0c;本質上還是以 定子 為基準的坐標系park變換 則將 α β αβ αβ坐標系 變換到 隨 轉…

軟件系統容量管理:反模式剖析與模式應用

在數字化時代&#xff0c;軟件系統的重要性日益凸顯。隨著業務的不斷拓展和用戶數量的持續增長&#xff0c;軟件系統的容量管理成為保障其高效運行的關鍵因素。《發布&#xff01;軟件的設計與部署》第二部分圍繞容量展開深入探討&#xff0c;系統地闡述了容量的定義、范圍&…