当前位置: 首页 > 知识库问答 >
问题:

ControllerAdvice在Spring Security之前捕获AuthenticationException

云霖
2023-03-14

我正在使用< code>ControllerAdvice来处理我的应用程序中的异常,它工作正常。然而,我开始使用Spring Security,通常我应该在下面的方法中捕获AuthenticationExceptions。

@Override
    public void commence(HttpServletRequest request, HttpServletResponse response, 
        AuthenticationException authException)
            throws IOException, ServletException {
        logger.error("Unauthorized error: {}", authException.getMessage());

        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

        final Map<String, Object> body = new HashMap<>();
        body.put("status", HttpServletResponse.SC_UNAUTHORIZED);
        body.put("error", "Unauthorized");
        body.put("message", authException.getMessage());
        body.put("path", request.getServletPath());

        final ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(response.getOutputStream(), body);
    }

当我删除异常处理类时,我可以在此方法中捕获AuthenticationException。但是,当我使用异常处理机制时,它会在开始方法之前捕获AuthenticationExceptions。

我尝试使用@令(值=Ordered.LOWEST_PRECEDENCE),但它没有任何意义。那么,我如何通过防止控制建议捕获它们来在这个开始方法中捕获身份验证异常呢?

共有1个答案

慕凌龙
2023-03-14

因此,请尝试添加注释@ExceptionHandler(AuthenticationException.class)

@ControllerAdvice
public class ControllerExceptionHandler {

@ExceptionHandler(AuthenticationException.class)
  ...
  public ErrorMessage resourceNotFoundException(AuthenticationException exception) {
    ...
  }
}

更多信息请参阅: https://www.baeldung.com/exception-handling-for-rest-with-spring 深潜Spring MVC 处理异常:

  • https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-exceptionhandlers
  • https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-rest-exceptions
 类似资料:
  • @ControllerAdvice类是RestResponseEntityExceptionHandler.java。 我被告知,默认情况下spring boot应该返回如下所示的内容 我给它的不存在的路径是 我的控制器类是Breweries_Controller

  • 这里有一个正则表达式。试试下面的字符串,我面临的问题是,在第一个组之后,每个捕获组的开头都有一个额外的空格。我需要匹配空白,但不需要捕捉它们。 正则表达式: 在上面的链接上查看它会使理解变得更简单。 这些是您可以一个接一个地粘贴到测试字符串区域中的一些字符串: 查看匹配组区域,注意在第1组之后,组之间的前1个空格被捕获。 我想做的是: 对于第一个和第二个捕获组,我希望他们检测到一个后续空间并吸收它

  • 我在我的应用程序中使用log4j来记录具有不同日志级别的某些包。 但是,stderr和stdout似乎没有在这个日志文件中捕获,而是在应用程序开始时将它们打印在文件中 是否可以在log4j中捕获stdout和stderr(例如,stdout作为info,stderr作为WARN/ERROR)以及out中。日志文件? log4j的设置如下: 更新: stackoverflow错误的StackTrac

  • 我试图捕获关键字后面的文本,一直到行的结尾。我花了很多时间在堆栈交换和在线regex测试人员上,试图找到正确的组合。 我非常接近,但我的输出继续捕获新的行。regex101.com声明.*?匹配任何字符(换行符除外)。我很难理解为什么它总是捕获换行符。 下面是我正在搜索的文本的一个片段: Blahblahlah\n公司:BALDWIN LINE CONST OF MD Inc\n联系人姓名:STE

  • 问题内容: 好了,那么,从这里开始,这里是我的代码: 因此出现错误,因为我试图在API调用中初始化temp。我知道这不是最可靠的方法,但我正在尝试首先使其起作用。 第一个错误是: 在初始化所有成员之前,闭包捕获了“自我” 在线上 我的第二个错误: 从初始化程序返回而不初始化所有存储的属性 在倒数第二 现在,显然我没有初始化正确。但是,我找不到执行最终目标的正确方法。也许我这样做完全错误? 问题答案

  • 本文向大家介绍PHP正则表达式之捕获组与非捕获组,包括了PHP正则表达式之捕获组与非捕获组的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中