怎么在Spring中利用Filter过滤器对全局异常处理进行配置
创始人
2024-12-26 11:21:28
0次

Spring下Filter过滤器配置全局异常处理

  • Filter中出现的异常,spring的全局异常处理器是无法捕获的,所以filter拦截器中出现的异常会直接的抛向浏览器,在浏览器中显示500错误。

  • 而我当前的项目中,是在Filter中判断用户是否有携带Token访问,如果没有,则抛出异常,让其做登录操作。而且异常信息要处理成json格式返回给前端。这就很尴尬了。

好了废话说多了,上解决方案:

结局方案:

Filter拦截器中直接抛出异常信息

@Component
public class AdminAuthentiationFilter extends OncePerRequestFilter {

  private final String DEFAULTE_URI = "/api/admin/login";
  @Override
  protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain filterChain) throws ServletException, IOException {

    String admin_token = req.getHeader("admin_token");

    if(StrUtil.isBlank(admin_token) && !req.getRequestURI().equals(DEFAULTE_URI)){
      //在拦截器中直接抛出一个异常
      throw new LoginException("用户未登录,请先登录!");
    }
    filterChain.doFilter(req,resp);
  }
}

第一步:在web.xml中配置错误页,用于捕获500状态



  myFilter
  com.fenkuan.support.filters.AdminAuthentiationFilter


  myFilter
  /*



  500
  /500

第二步:编写一个FilterException自定义异常类

public class FilterException extends RuntimeException{
	private String data;
  public FilterException(String message) {
    super(message);
  }

  public FilterException(String message, String data) {
    super(message, data);
    this.data = data;
  }
   public String getData() {
    return data;
  }
}

第三步:编写一个用于处理500错误的controller

@RestController
public class FilterErrorController {

  @RequestMapping("/500")
  public void filterError(HttpServletRequest req){
    //获取servlet请求中的异常属性。该属性下存储了确切的错误信息。
    Throwable t = (Throwable) req.getAttribute("javax.servlet.error.exception");
		//创建一个filterException抛出,该异常会被全局异常处理类捕获,并处理。
    throw new FilterException(t.getMessage());
  }
}

第四步:编写一个捕获全局异常的异常处理类

//全局异常处理类
@RestControllerAdvice
public class ControllerExceptionHandler{

  @ExceptionHandler(FilterException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public BadException filterException(FilterException e){
    BadException objectBadException = handleExceptionObject(e);
    objectBadException.setStatus(HttpStatus.BAD_REQUEST.value());
    objectBadException.setMessage(e.getMessage());
    return objectBadException;
  }
  
  @ExceptionHandler(Exception.class)
  @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
  public BadException responseException(Exception e){
    	//异常兜底处理
    BadException objectBadException = handleExceptionObject(e);
    objectBadException.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
    objectBadException.setMessage(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
    return objectBadException;
  }
//  Throwable是Exception的父类,所以可以使用该类型来接受项目中抛出的所有异常,包括Exception即其子类。
  private  BadException handleExceptionObject(Throwable throwable){
    BadException bad = new BadException<>();
    bad.setMessage(throwable.getMessage());
    return bad;
  }
}

BadException类,用于封装要返会给前端的异常信息(这里使用了Lombok工具)

import lombok.Data;

@Data
public class BadException {
  private Integer status;
  private String message;
  private Object data;
  private Object devData;
}

结果:

怎么在Spring中利用Filter过滤器对全局异常处理进行配置

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...