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.mzph.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;系统地阐述了容量的定义、范围&…