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