当前位置: 首页 > 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。

通过以上三种方式,你可以轻松实现对后端接口调用的拦截处理,从而提升系统的安全性和可维护性。

相关文章:

  • 【线性规划】对偶问题的实际意义与重要性质 学习笔记
  • 大数据应用开发与实战(1)
  • 模板--进阶
  • 民办生从零学C的第十二天:指针(1)
  • 辛格迪客户案例 | 华道生物细胞治疗生产及追溯项目(CGTS)
  • Qt内置图标速查表
  • 编译原理:由浅入深从语法树到文法类型
  • TMI投稿指南(三):共同作者
  • Unity-粒子系统:萤火虫粒子特效效果及参数
  • GPU虚拟化实现(四)
  • [实战] IRIG-B协议详解及Verilog实现(完整代码)
  • 【重走C++学习之路】22、C++11语法
  • vim粘贴代码格式错乱 排版错乱 缩进错乱 解决方案
  • C++(初阶)(十四)——多态
  • 程序进程多任务线程
  • el-dialog弹窗关闭时调了两次刷新数据的接口
  • Linux文件的一般权限
  • 在Spark集群中搭建Standalone
  • 2025“钉耙编程”中国大学生算法设计春季联赛(8)10031007
  • 嵌入式开发学习日志Day11
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 烟花、美食和购物优惠都安排上了,上海多区开启热闹模式
  • 美国“杜鲁门”号航母一战机坠海
  • 第二艘国产大型邮轮实现坞内起浮,重点强化邮轮供应链本土化建设
  • 国务院任免国家工作人员:饶权任国家文物局局长
  • 党旗下的青春|83岁仍在“下生活”,他说生活是创作的源泉