我想使用通用方式来管理5xx错误代码,特别是当整个Spring应用程序中的db关闭时。我想要一个漂亮的错误json而不是堆栈跟踪。
对于控制器,我有一个@ControllerAdvice
针对不同异常的类,这也捕获了db在请求中间停止的情况。但这并不是全部。我也碰巧有一个自定义CorsFilter
扩展名OncePerRequestFilter
,在那里,当我打电话给doFilter
我时CannotGetJdbcConnectionException
,它将不受的管理@ControllerAdvice
。我在网上阅读了几件事,这只会让我更加困惑。
所以我有很多问题:
ExceptionTranslationFilter
但这只能处理AuthenticationException
或AccessDeniedException
。HandlerExceptionResolver
,但这使我感到怀疑,我没有要管理的任何自定义异常,必须有比这更明显的方法。我还尝试添加一个try / catch并调用的实现HandlerExceptionResolver
(应该足够好,我的例外没什么特别的),但这在响应中不返回任何内容,我得到一个状态200和一个空主体。有什么好办法解决这个问题吗?谢谢
这就是我所做的:
我在这里阅读了有关过滤器的基础知识,并且发现需要创建一个自定义过滤器,该过滤器将首先出现在过滤器链中,并且将尝试捕获所有可能在此处发生的运行时异常。然后,我需要手动创建json并将其放入响应中。
所以这是我的自定义过滤器:
public class ExceptionHandlerFilter extends OncePerRequestFilter {
@Override
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (RuntimeException e) {
// custom error response class used across my project
ErrorResponse errorResponse = new ErrorResponse(e);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
response.getWriter().write(convertObjectToJson(errorResponse));
}
}
public String convertObjectToJson(Object object) throws JsonProcessingException {
if (object == null) {
return null;
}
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(object);
}
}
然后我在之前将其添加到web.html" target="_blank">xml中CorsFilter
。而且有效!
<filter>
<filter-name>exceptionHandlerFilter</filter-name>
<filter-class>xx.xxxxxx.xxxxx.api.controllers.filters.ExceptionHandlerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>exceptionHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我想使用通用的方式来管理5xx错误代码,让我们具体地说,当数据库在我的整个spring应用程序关闭的情况。我想要一个相当错误的json而不是堆栈跟踪。 对于控制器,我有一个类来处理不同的异常,这也可以捕捉db在请求中间停止的情况。但这还不是全部。我还碰巧有一个自定义的扩展了,当我调用时,我会得到并且它不会被管理。我在网上读了几件事,只会让我更加困惑。 所以我有很多问题: 是否需要实现自定义筛选器?
我是Spring Security的新手。 我有一段代码,我检查是否在请求中传递了授权头,如果缺少,我抛出一个异常。 我的目标是在全球范围内处理所有异常,因此我使用@ControllerAdvice。 注意:我知道@ControllerAdvice对于从这个和这个抛出的控制器之外的异常不起作用,所以我也遵循了这些链接中的建议。 重新验证入口点。Java语言 这是我配置authenticationE
我正在使用Spring4和Tomcat。问题是有时我不得不在我的筛选器中抛出一个(自定义的)RuntimeException(控件甚至还没有到达控制器)。问题是,由于我没有抛出tomcat理解的异常,它被转换为500(内部服务器错误)。我相信403禁止会比500好(对于我的定制例外)。我查看了和注释。但只有当控件到达控制器时,这些才起作用。 到目前为止,我在筛选器的中将状态手动设置为403。有没有
我有一个验证令牌的自定义筛选器tokenLoginFilter 我的Spring安全 令牌登录过滤器 在authenticationmanager . authenticate调用中,我从TokenAuthenticationProvider中抛出了BadCredentialsException 令牌身份验证提供程序 Tomcat将此BadCredentialsException解释为错误代码50
问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在
我正在处理一个Spring启动应用程序。我尝试处理异常。但我想我这样做的方式有问题,因为它总是抛出内部服务器错误500。 我尝试设置自定义异常类,并且还使用带有@响应状态的响应状态代码。但是不管异常是什么,它只会抛出内部服务器错误。我使用的是intellij,我在异常中给出的消息打印在那里,但响应正文empty.This我想一定是因为它抛出了内部服务器错误。 控制器类 intellij 中的终端打