springsecurity自定义异常并解决报错Error: Parse Error: Response overflow

本文介绍如何在Spring Security中配置自定义过滤器,解决因token过期导致的异常处理问题,确保统一全局异常响应。通过自定义ControllerExceptionFilter并加入Web过滤器链,实现401错误响应的标准化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在写项目过程中,使用springsecurity进行权限管理,并自定义token过滤器加到验证过滤器之前,这时就会出现一个问题,当token过期时,会调用springsecurity的异常处理机制,而不会使用我的全局异常处理

解决方案

自定义过滤器

package com.fruiter.filter;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.ExpiredJwtException;
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;

/**
 * 处理Controller抛出异常会被该过滤器处理
 */
public class ControllerExceptionFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (ExpiredJwtException e) {
            e.printStackTrace();

            response.setStatus(401);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print("token过期");
        }
    }

    public String convertObjectToJson(Object object) throws JsonProcessingException {
        if (object == null) {
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(object);
    }
}

加入进行管理

//WebAsyncManagerIntegrationFilter是第一个异常处理的过滤器
http.addFilterBefore(new ControllerExceptionFilter(), WebAsyncManagerIntegrationFilter.class);

注意

这里对response设置其状态码,即response.setStatus(401);
不能设置如10010这样过大的数字,不然在postman测试的时候会出现报错Error: Parse Error: Response overflow
在这里插入图片描述

修改为401即可
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值