当前位置: 首页 > news >正文

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.xdnf.cn/news/200017.html

相关文章:

  • STM32实现SPI转USB虚拟串口输出(实测40M时钟不丢包)
  • 报表工具:企业数据决策的“智能翻译官“
  • 【knife4j】添加Cookie
  • 12. RANSAC点云多平面拟合分割
  • MySQL5.7.21查询入门
  • 软链接与硬链接
  • Transformer Prefill阶段并行计算:本质、流程与思考
  • 电价单位解析与用电设备耗电成本计算
  • python程序设习题答案
  • 沐曦玩转 LMDeploy、XTuner 和 InternLM3
  • es2025新特性
  • lmms-eval--微调实战笔记
  • 2.2.2goweb内置的 HTTP 处理程序2
  • Nature Communications 仿生电子天线:赋予机器人敏锐 “触觉”
  • TimDbg
  • AT2401C与RFX2401C问题处理资料
  • 新环境注册为Jupyter 内核
  • Python内置方法干货总结
  • [OS_9] C 标准库和实现 | musl libc | offset
  • 关于消息队列的一些事~
  • LeetCode【剑指offer】系列(图和其他篇)
  • 某校多档口食堂就餐行为可视化分析-Tableau
  • MySQL基础篇 | 1-数据库概述与MySQL安装
  • 常见算法的总结与实现思路
  • 【补题】ACPC Kickoff 2025 F. Kinan The Bank Robber
  • tensor 的计算操作
  • C#核心知识
  • Allegro23.1新功能之如何解冻动态铜皮操作指导
  • Druid监控sql导致的内存溢出
  • [Windows] MousePlus 5.5.9