spring boot 全局异常处理通过实现 @controlleradvice 配合 @exceptionhandler 注解来捕获安全校验异常。具体做法是定义一个配置类,在其中编写专门处理特定安全异常(如 accessdeniedexception)的方法,该方法接收异常对象并返回自定义的 json 响应或重定向页面。这样当 spring security 拦截到非法访问时,会自动触发该处理器,从而统一处理错误信息。

如何配置全局异常处理器类
需要创建一个继承自 ResponseEntityExceptionHandler 或直接使用 @RestControllerAdvice 的类。在这个类中,定义一个方法并使用 @ExceptionHandler 指定要捕获的异常类型,例如 AccessDeniedException。该方法内部可以构建一个统一的错误响应对象,包含状态码、错误消息和详细信息,然后将其封装在 ResponseEntity 中返回。这确保了所有未处理的异常都能被集中管理,避免暴露堆栈跟踪信息给前端。

import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(AccessDeniedException.class)
public ResponseEntity<string> handleAccessDenied(AccessDeniedException ex) {
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.body("Access Denied: " + ex.getMessage());
}
}</string>
如何处理其他类型的认证异常
除了访问拒绝异常,安全框架还可能抛出 AuthenticationException 或其子类,如 BadCredentialsException。可以在同一个 @RestControllerAdvice 类中添加另一个 @ExceptionHandler 方法来处理这些情况。通常,认证失败意味着用户身份验证未通过,此时应返回 401 Unauthorized 状态码。通过区分不同的异常类型,可以为前端提供更有针对性的错误提示,例如区分“密码错误”和“权限不足”。这种分层处理机制使得异常响应更加清晰和规范。

import org.springframework.security.core.AuthenticationException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.HttpStatus;
@ExceptionHandler(AuthenticationException.class)
public ResponseEntity<string> handleAuthException(AuthenticationException ex) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
.body("Authentication Failed: " + ex.getMessage());
}</string>
当请求缺少必要的安全令牌时会发生什么
如果请求头中缺少有效的 JWT 令牌或 Session ID,Spring Security 的过滤器链会在早期阶段检测到这一缺失,并抛出相应的异常,通常是 AuthenticationException 的子类。由于我们已经在 @RestControllerAdvice 中注册了对 AuthenticationException 的处理,因此该异常会被全局处理器捕获。最终,客户端将收到一个 HTTP 401 响应,其中包含我们在处理方法中定义的友好错误消息,而不是默认的服务器错误页面。这保证了即使在没有令牌的情况下,API 也能以标准化的格式返回错误信息,便于前端进行跳转或提示。











