Java 捕获filter抛出的异常 自定义返回码

web项目中过滤器抛出的异常不直接被全局异常处理捕获,不过我们可以选择其他办法达到目录
实例代码


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        String reqUrl = request.getRequestURI();
        log.info("当前请求:{}",reqUrl);
        if (StringUtils.equals(reqUrl, LOGIN_URL)) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        String authzHeader = getAuthzHeader(servletRequest);
        if(StringUtils.isBlank(authzHeader)){
            NeedLoginException exception = new NeedLoginException("请先登录!");
            request.setAttribute(CommonConsts.NEED_LOGIN_ERROR,exception);
            throw exception;
        }
        boolean verify = JwtUtil.verify(authzHeader);
        if(!verify){
            NeedLoginException exception = new NeedLoginException("无效token,请先登录!");
            request.setAttribute(CommonConsts.NEED_LOGIN_ERROR,exception);
            throw exception;

}
import io.swagger.annotations.Api;
import org.springframework.boot.autoconfigure.web.ErrorProperties;
import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@RestController
@Api(tags = "拦截Filter抛出的异常")
public class ErrorController extends BasicErrorController {
    public ErrorController() {
        super(new DefaultErrorAttributes(), new ErrorProperties());
    }

    public ErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) {
        super(errorAttributes, errorProperties);
    }

    public ErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers) {
        super(errorAttributes, errorProperties, errorViewResolvers);
    }

    @RequestMapping
    @Override
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Object obj = request.getAttribute(CommonConsts.NEED_LOGIN_ERROR);
        Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
        if (null != obj) {
            /**
             * 设置登录跳转错误码
             */
            body.put("status",HttpStatus.UNAUTHORIZED);
        }

        HttpStatus status = this.getStatus(request);
        return new ResponseEntity(body, status);
    }
}
{
    "timestamp": "2022-01-10 14:08:08",
    "status": 401,
    "error": "Internal Server Error",
    "message": "无效token,请重新登录",
    "path": "/xxxxx"
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值