温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在spring boot中实现默认异常处理

发布时间:2021-05-27 17:52:30 来源:亿速云 阅读:247 作者:Leah 栏目:编程语言

这篇文章给大家介绍如何在spring boot中实现默认异常处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

莫名的拦截器

项目配置了一个拦截器,专门用来对用户进行验证是否登录的,这个是前提.在使用response.setStatus()方法时,前台能正确的接受到传入的状态码,而使用response.sendError()时,前台却接受到的一直是401用户未登录的状态码,打了断点进行调试,分别在拦截器,跑出异常的方法,处理异常的方法打上断点,测试使用response.setStatus()和response.sendError()方法来查看执行顺序,结果让我感到惊奇:

使用response.setStatus()执行顺序:

如何在spring boot中实现默认异常处理

使用response.sendError()执行顺序:

如何在spring boot中实现默认异常处理

出现了令人惊奇两点:

1.setStatus()请求时没有经过拦截器
2.sendError()在异常处理完毕后经过了一次拦截器

查看注册拦截器配置,解决了第一个问题的疑惑:

public void addInterceptors(InterceptorRegistry registry) {
    // 添加拦截器,去除对登录的拦截
    registry.addInterceptor(authInterceptor)
    .excludePathPatterns("/user/login")
    .excludePathPatterns("/user/wechatLogin");
  }

这个异常是用户登录时抛出的,在注册时将登录路径给忽略了,因为我们只是拦截未登录的请求,而请求登录的请求不应该拦截,这是正确的,但第二点却怎么也不明白,本应忽略拦截的请求,为什么换了sendError()方法后,却在异常处理完毕后经过了异常拦截器?

springboot的默认异常处理

对比两个方法的不同:setStatus()只是改了一下状态吗,而sendError()还有请求错误的意味,于是猜想是不是请求错误才会出现这种情况,将方法直接改为throw new RuntimeException()(没有处理异常),发现拦截器拦截的请求的url居然是一个/error的url.

如何在spring boot中实现默认异常处理

这个/error的url并未在项目中定义过任何的控制器中,也从未发起这样的请求,上网一查询,原来这是Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容.
但是我们的拦截器把这个请求拦截了(并且这个请求没有携带正确的cookie),所以直接就返回了401错误,response中也没有我们定义的状态码和信息了.

json还是html

一切真相大白了,但忽然想到如果是浏览器发起的请求,服务器错误后springboot默认异常处理返回的是html,但是如果像我们前后台分离的请求,返回就不应该是html而是json的错误信息了,这个要怎么区分呢?
使用google插件发送请求,返回的body是这样的:

如何在spring boot中实现默认异常处理

而用浏览器发起的请求返回的却是一个html页面:

<html>
<body>
<h2>Whitelabel Error Page</h2>
<p>This application has no explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Sat Apr 13 21:34:34 CST 2019</div>
<div>There was an unexpected error (type=Internal Server Error, status=500).</div>
<div>No message available</div>
</body>
</html>

仔细查看两者发起的请求不同,在浏览器发起请求信息requestheader上发现了Accept字段:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

关于如何在spring boot中实现默认异常处理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI