`

ExceptionHandler结合HandlerInterceptorAdapter

阅读更多
spring项目中,要统一处理异常,ExceptionHandler是必须实现的,但是@ExceptionHandler是不能拦截HandlerInterceptorAdapter.preHandle()方法抛出的异常的,根本原因还要看执行顺序:Filter->Interceptor->ControllerAdvice->Aspect,preHandle不会受ControllerAdvice影响。

所以Filter我们可以可以通过跳转的方式特殊处理:
request.getRequestDispatcher("/exception/401").forward(request,response);

同时需要实现ExceptionController

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.publisher.common.vo.Res;
import com.publisher.common.vo.ResultCode;
import com.publisher.exception.ServiceException;


//@Controller
@RestController
@RequestMapping("/exception")
public class ExceptionController {

	@Value("${publisher.privateKey}")
	private String privateKey;
	
	
	@RequestMapping("/401")
    @ResponseBody
    public Res handle() {
        throw new ServiceException(ResultCode.UNAUTHORIZED);
    }
}


HandlerInterceptorAdapter完整代码:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.publisher.utils.JwtUtils;
import com.publisher.utils.SessionUtils;

import io.jsonwebtoken.Claims;

@Component
public class LoginFilter  extends  HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		String path = request.getServletPath();

		if(StringUtils.equals("/v1/getToken", path)||StringUtils.equals("/index.html", path)){//白名单
			return true;
		}
		String token  = request.getHeader("token");
		if(StringUtils.isBlank(token)){
//			throw new ServiceException(ResultCode.UNAUTHORIZED);
			 request.getRequestDispatcher("/exception/401").forward(request,response);
			return false;
		}
			try{
			Claims aa = JwtUtils.checkJWT(token);
			SessionUtils.setMember(aa);
			}catch(Exception e){
				request.getRequestDispatcher("/exception/401").forward(request,response);
				return false;
//				throw new ServiceException(ResultCode.UNAUTHORIZED);
			}
		return true;
	}
	
	
}



ExceptionHandler 异常统一统一处理类

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;

import com.publisher.common.vo.Res;
import com.publisher.common.vo.ResultCode;
import com.publisher.exception.ServiceException;

import java.util.regex.Pattern;

@ControllerAdvice
public class ExceptionHandler {

	Pattern p = Pattern.compile("[\u4e00-\u9fa5]");

    @org.springframework.web.bind.annotation.ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Res handle(MethodArgumentNotValidException e) {
        String message = ResultCode.FAILED.getMsg();
        if (e.getBindingResult().getAllErrors().size() > 0) {
            message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        }
//        Matcher matcher = p.matcher(message);
//        if (!matcher.find()) {
//            e.printStackTrace();
//        }
        return Res.failed(message);
    }

    @org.springframework.web.bind.annotation.ExceptionHandler(value = {IllegalArgumentException.class})
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Res handle(IllegalArgumentException ex) {
        String message = ex.getMessage();
//        Matcher matcher = p.matcher(message);
//        if (!matcher.find()) {
            ex.printStackTrace();
//        }
        return Res.failed(message);
    }

    @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Res handle(Exception e) {
        String message = e.getMessage();
//        Matcher matcher = p.matcher(message);
//        if (!matcher.find()) {
            e.printStackTrace();
//        } 
        return Res.failed(message);
    }

//ServiceException业务异常,可预知业务错误,不输出异常堆栈,比如说授权失败。
@org.springframework.web.bind.annotation.ExceptionHandler(ServiceException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Res handle(ServiceException e) {
        return Res.failed(e.getResultCode());
    }
分享到:
评论

相关推荐

    iOS 异常捕捉及处理发送。ExceptionHandler

    `ExceptionHandler`是一个专门用于捕获和处理iOS应用中的异常的机制。这个机制允许我们优雅地处理程序运行时可能出现的错误,避免应用崩溃,并提供详细的信息以便于定位问题。 首先,让我们了解一下iOS中的异常模型...

    iOS 异常捕捉及处理发送。ExceptionHandler.

    `ExceptionHandler`通常是指一个系统或第三方库,用于捕获并处理程序中的异常,确保应用的稳定性和用户体验。本文将详细介绍iOS中的异常处理机制以及如何使用`ExceptionHandler`进行异常管理和日志记录。 ### iOS ...

    WCF_ExceptionHandler

    **WCF_ExceptionHandler** Windows Communication Foundation (WCF) 是微软.NET框架中的一种技术,用于构建分布式应用程序,它提供了丰富的服务模型来实现不同系统间的通信。`WCF_ExceptionHandler`是针对WCF服务的...

    ExceptionHandler:json格式的处理程序异常

    customExceptionHandler(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line'])); } } ``` 5. **最佳实践** - 在生产环境中,应确保异常处理器不会泄露敏感信息,例如源...

    ExceptionHandler.zip

    "ExceptionHandler.zip"这个压缩包就提供了一个全面的minidump示例,涵盖了各种测试用例,适用于win32和win64平台,对于C/C++开发者来说,这是一个宝贵的资源。 首先,让我们来理解什么是minidump。Minidump是...

    Android 测试捕获异常消息ExceptionHandler用法.rar

    Android 测试捕获全局异常消息ExceptionHandler用法,我自己测试抛出一个异常,thread为未捕获异常的线程, e为未捕获的异常,收集当前的手机信息,捕获手机当前的异常信息,然后写入异常信息到文件中,最后使用 ...

    Laravel开发-exception_handler

    本篇文章将深入探讨Laravel的异常处理机制,以及如何自定义`ExceptionHandler`来满足项目需求。 首先,Laravel的异常处理主要由`\App\Exceptions\Handler`类负责,这个类在`app/Exceptions`目录下。`Handler`类继承...

    GoogleBreakpad捕获崩溃文件需要的文件,包括lib库文件及头文件

    例如,你可能需要在你的主程序中创建一个`ExceptionHandler`对象,它负责监听异常并生成崩溃转储: ```cpp #include "google_breakpad/client/windows/handler/exception_handler.h" std::wstring dump_path; // ...

    Laravel开发-laravel-exception-handlers

    在Laravel框架中,异常处理是系统运行过程中不可或缺的一部分。异常是程序运行时遇到的错误或不正常情况,而异常处理则确保这些错误能够被优雅地捕获、记录和响应,从而保持应用的稳定性和用户体验。...

    ExceptionHandler-开源

    《ExceptionHandler开源库解析》 ExceptionHandler是一款专为Windows平台设计的开源异常处理库,它主要针对的是那些希望在软件发布后能够捕获并分析程序崩溃情况的开发者。通过集成这个库,开发者可以设置程序在...

    Disruptor报错FatalExceptionHandler的解决办法,看网上这种解决办法挺少,整理了一下

    总的来说,遇到Disruptor的`FatalExceptionHandler`错误时,应从多个角度进行排查,结合具体的异常信息分析原因,并采取相应的措施进行修复和优化,以确保系统的稳定运行。同时,良好的编程习惯和全面的测试策略是...

    Spring MVC跟jQuery和Twitter Bootstrap的结合

    5. **异常处理**:Spring MVC通过`@ExceptionHandler`注解处理异常,可以返回定制的错误页面。配合jQuery,可以在前端优雅地处理错误,如弹出错误消息。 6. **RESTful API**:Spring MVC支持构建RESTful服务,与...

    spring_exceptionHandler:Spring bootSpring 统一错误处理方案的使用

    spring_exceptionHandler Spring boot/Spring 统一错误处理方案的使用

    log-it-down:AngularJS 模块,将您所有的 $log 和 $exceptionHandler 消息收集到一个服务中以供以后检查

    logItDown是一个AngularJS模块,它将您所有的$log和$exceptionHandler消息收集到一个服务中以供以后检查。 这为您提供了一个类似于日志的后端,您可以在其中查看异常之前发生的情况。 安装 通过下载源代码。 ...

    SpringMVC 中的拦截器与异常处理

    通过实现`HandlerInterceptor`接口或者继承`HandlerInterceptorAdapter`抽象类,开发者可以定义自己的拦截器。拦截器通常用于实现如登录检查、权限验证、日志记录、性能统计等跨切面的功能。 1. 拦截器的注册:拦截...

    android全局异常处理

    CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler(currentUEH); Thread.setDefaultUncaughtExceptionHandler(customExceptionHandler); } } ``` 除了处理主线程的异常,我们还需要...

    基于SpringBoot企业级完善架构

    6. **ExceptionHandler(错误消息统一处理)**:在SpringBoot应用中,通过全局异常处理器(@ControllerAdvice + @ExceptionHandler)可以统一处理所有控制器层的异常,提供友好的错误提示,同时便于日志记录和问题...

    android工程全局异常处理-将未处理异常日志保存在文件中,可后续开发提交至服务器

    CustomExceptionHandler exceptionHandler = new CustomExceptionHandler(this); Thread.setDefaultUncaughtExceptionHandler(exceptionHandler); } } ``` 现在,当应用中的任何线程抛出未捕获的异常时,`...

    swoft首个基于Swoole原生协程的新时代PHP高性能协程全栈组件化框架

    首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用...

    安卓异常捕获

    在实际开发中,还可以结合Android的`Crashlytics`或`Fabric`等第三方服务,它们提供了更完善的异常捕获和分析功能,可以自动收集错误报告并提供详细的崩溃分析。 总的来说,通过自定义`Thread....

Global site tag (gtag.js) - Google Analytics