springboot捕获filter异常
由于GlobalException
自定全局捕获异常类只能捕获 control
层抛出的异常,当我们想捕获Filter
层抛出的异常时, GlobalException
是无法捕获的:
基本springboot捕获filter异常的方式有:
- 定义一个继承自BasicErrorController的类,重写error方法.!!!这里不推荐这个,我看了许多博客也不知道怎么写。
- 在Filter发生的异常捕获并转发到统一处理异常的 一个
ErrorController类中再次抛出,这样GlobalException就能捕获并返回json给前端了
(优点:解耦合,代码利于改动)(缺点:抛出了两次异常,性能消耗和资源消耗大,不利于记录日志) - 直接在
Filter抛出异常就直接返回 json给前端,
这样不太好,因为没办法统一管理抛出什么异常需返回什么json提示!
由此可知,方式2比较优:
如何解决呢?
1.定义全局异常捕获类
/**
* 全局捕获异常类
*/
@ControllerAdvice// 可指定包前缀,比如:(basePackages = "com.pj.admin")
public class GlobalException {
/**
* 拦截 NotLoginException异常
*
*/
@ResponseBody
@ExceptionHandler(value = NotLoginException.class) // 异常拦截(拦截项目中的 NotLoginException 异常)
public String handlerNotLoginException(Exception e, HttpServletRequest request, HttpServletResponse response){
ResultBody res = ResultBody.getNotLogin();
System.out.println("-------开始");
System.out.println(res);
return res.toString();
}
/**
* 拦截 NotRoleException异常
*
*/
@ResponseBody
@ExceptionHandler(value = NotRoleException.class) // 异常拦截(拦截项目中的 NotLoginException 异常)
public String handlerNotRoleException(Exception e, HttpServletRequest request, HttpServletResponse response){
NotRoleException ee = (NotRoleException) e;
return ResultBody.getNotRole(ee.getMsg()).toString();
}
/**
* 拦截 NotPermissionException异常
*
*/
@ResponseBody
@ExceptionHandler(value = NotPermissionException.class) // 异常拦截(拦截项目中的 NotLoginException 异常)
public String handlerNotPermissionException(Exception e, HttpServletRequest request, HttpServletResponse response){
NotPermissionException ee = (NotPermissionException) e;
return ResultBody.getNotRole(ee.getMsg()).toString();
}
}
2.定义ErrorController
:
@RestController
public class ErrorController {
/**
* 重新抛出异常
*/
@RequestMapping("/error/exthrow")
public void rethrow(HttpServletRequest request) throws Exception {
throw ((Exception) request.getAttribute("filter.error"));
}
}
3.在Filter
捕获异常并转发给ErrorController
让其再次抛出,从而使得GlobalException
捕获其并做出响应。
@WebFilter(value = {"/test"})
public class TestFilter implements Filter {
@Autowired
UserServiceImpl userService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
List<User> userList = userService.list();
System.out.println("***************");
System.out.println(userList);
try{
if(userList.size()<2){
throw new NotLoginException(403,null);
}
}catch (Exception e){
// 异常捕获,发送到error controller
request.setAttribute("filter.error", e);
//将异常分发到/error/exthrow控制器
request.getRequestDispatcher("/error/exthrow").forward(request, response);
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}