Spring下Filter过滤器配置全局异常处理的详细步骤

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状态

<!-- 注册过滤器-->
<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>com.fenkuan.support.filters.AdminAuthentiationFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<!--捕获500错误状态-->
<error-page>
  <error-code>500</error-code>
  <location>/500</location>
</error-page>

第二步:编写一个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<Object> 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 <T> BadException<T> handleExceptionObject(Throwable throwable){
    BadException<T> bad = new BadException<>();
    bad.setMessage(throwable.getMessage());
    return bad;
  }
}

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

import lombok.Data;

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

结果:

到此这篇关于Spring下Filter过滤器配置全局异常处理的详细步骤的文章就介绍到这了,更多相关Spring全局异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring boot 配置Filter过滤器的方法

    Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter 首先要准备一个实现了Filter的接口的类 SessionFilter: import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRespo

  • Spring Cloud Gateway全局异常处理的方法详解

    前言 Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式.Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等

  • 详解Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大. 那么,能不能将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的.下面将介绍使用Spring MVC统一处理异常的解决和实现过程 使用Spring MVC提供的SimpleMappingE

  • 详解SpringCloud Gateway之过滤器GatewayFilter

    在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来我们阅读Spring-Cloud-Gateway的整个过滤器类结构以及主要功能 通过源码可以看到Spring-Cloud-Gateway的filter包中吉接口有如下三个,GatewayFilter,GlobalFilter,GatewayFilterChain,下来我依次阅读接口的主要实现功能. GatewayFilterChain 类图 代码 /** * 网关过滤链表接口 * 用

  • springboot全局异常处理详解

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import

  • spring boot过滤器FilterRegistrationBean实现方式

    有2种方式可以实现过滤器 1:通过FilterRegistrationBean实例注册 2:通过@WebFilter注解生效 这里选择第一种,因为第二种不能设置过滤器之间的优先级 为了演示优先级,这里创建2个测试过滤器类:Test1Filter.Test2Filter 通过实现javax.servlet.Filter接口,覆盖其doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)方法,决定拦截或放行 publi

  • Spring Boot的filter(过滤器)简单使用实例详解

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public FilterRegistrationBean indexFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(new IndexFilter()); registration.addUrlPatterns("/&quo

  • Spring Boot全局异常处理解析

    本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下 1.后台处理异常 a.引入thymeleaf依赖 <!-- thymeleaf模板插件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>

  • Spring下Filter过滤器配置全局异常处理的详细步骤

    Spring下Filter过滤器配置全局异常处理 Filter中出现的异常,spring的全局异常处理器是无法捕获的,所以filter拦截器中出现的异常会直接的抛向浏览器,在浏览器中显示500错误. 而我当前的项目中,是在Filter中判断用户是否有携带Token访问,如果没有,则抛出异常,让其做登录操作.而且异常信息要处理成json格式返回给前端.这就很尴尬了. 好了废话说多了,上解决方案: 结局方案: Filter拦截器中直接抛出异常信息 @Component public class Ad

  • Android Studio安装配置、环境搭建详细步骤及基本使用的详细教程

    前言 Android Studio的安装配置及使用篇终于来啦~ 废话不多说,以下针对JDK正确安装(及其环境变量配置完毕,即Java开发环境下).Android Studio的安装,配置,以及创建工程.主题字体更换.窗口工具.布局.快捷方式等的基本使用逐一说明. 安装java 下载Java安装包(jdk,网上有很多下载地址,最好去官网下:https://www.java.com/zh_CN/),安装完后记得配置环境变量: 在"系统变量"新建一个变量名为JAVA_HOME的变量,变量值为

  • Spring Boot 打包上传Docker 仓库的详细步骤

    重要提示:学习本文之前需要提前了解docker容器相关的知识,了解和熟练运用常用的docker操作命令,如果已经了解了docker容器相关的知识那我们就开搞吧! 以下是完成标题所述功能的大致步骤: 搭建docker镜像仓库 修改Spring Boot 配置文件添加docker仓库配置,打包,上传至docker 镜像仓库 从自己搭的docker镜像仓库拉取上传的镜像文件并运行 Step1 搭建docker镜像私有仓库 搭建docker镜像仓库我们需要依赖docker-registry工具 ,doc

  • Android Studio配置Kotlin开发环境详细步骤

    Android Studio配置Kotlin开发环境详细步骤 第一步:安装Kotlin插件 打开Settings面板,找到Plugins选项,点击Browse repositories(浏览仓库),输入"Kotlin"查找,然后安装即可.安装完成之后需要重启Android Studio (切记!). 安装完成之后如下图所示. 插件当前的最新版本是1.1.2-release-Studio-2.3-3. 第二步:配置Kotlin开发环境 点击菜单栏的"Tools"选项,

  • CentOS 7.4 64位安装配置MySQL8.0的详细步骤

    第一步:获取mysql YUM源 进入mysql官网获取RPM包下载地址 https://dev.mysql.com/downloads/repo/yum/ 点击下载 获取到下载链接: https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm -------------------------------------------------------------------------------- 第二步:下载和安装

  • IDEA 2020 配置Tomcat服务器的详细步骤

    IDEA 2020 配置Tomcat的步骤如下所示: 第一步 下载Tomcat 官网链接:http://tomcat.apache.org/ 选择download,找到自己所要的版本,下载对应版本的Tomcat. 跟我之前的文章一样,我依旧推荐下载免安装的压缩包. 有zip和exe两种格式的,zip(64-bit Windows zip(pgp,md5,sha1))是免安装版的,exe(32-bit/64-bit Windows Service installer(pgp,md5,sha1))是

  • IDEA配置Maven的超详细步骤

    目录 一.Maven下载&环境配置 1.下载Maven 2.解压 3.配置环境变量 4.测试 二.更改Maven中的设置 1.编辑settings.xml 2.配置本地仓库 3.更换默认更新源 4.添加JDK的版本 三.在IDEA中配置Maven 1. 打开IDEA,新建一个空项目: 2. 打开设置找到Maven,设置Maven主路径.用户设置文件.本地仓库的地址: 3. 进到Maven导入(importing)设置,在导入程序的VM选项中添加: 4. 创建一个新模块: 四.测试 1.在pom.

  • 手把手教你如何用Pycharm2020.1.1配置远程连接的详细步骤

    配置说明 使用Pycharm 2020.1.1 professional 专业版.(据说只有专业版可以远程连接)如果不是专业的伙伴,可以用校园邮箱注册一个专业版,免费的哦! 步骤 1. 设置Connection 配置文件在这里Tools->Deployment->Configuration 进入后看到如下界面. 如果你是首次设置,需要点击左上角的"+"添加配置信息.类型选择"SFTP".然后添加SHH configuration信息,界面如下.填写Hos

  • idea配置连接数据库的超详细步骤

    学习时,使用IDEA的时候,需要连接Database,连接时遇到了一些小问题,下面记录一下操作流程以及遇到的问题的解决方法. 一. 连接操作 简介:介绍如何创建连接,具体连接某个数据库的操作流程. 1.1 创建连接 打开idea,点击右侧的 Database 或者 选择 View --> Tool Windows --> Database 点击 + 号 ,选择 Data Source ,选择 数据库 (下面以MySQL为例) 选择 mysql 后弹出以下界面 填上信息后,点击 Test Con

  • Centos8搭建配置nis域服务详细步骤

    目录 NIS 简介 网络环境: 1.环境准备(两个节点都要) 2.nis主服务器配置 3.nis客户端设置  NIS 简介 NIS,英文的全称是network information service,也叫yellow pages.在Linux中,NIS是一个基于RPC的client/server系统,需要使用 RPC 服务. RPC即Remote Procedure Call Protocol(远程过程调用协议),RPCBIND用于取代旧版本中的portmap组件.简单说,RPCBIND就是为了

随机推荐