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

在spring boot中,自定义异常没有通过通知控件

喻珂
2023-03-14

我试图自定义一个引发的异常,但它不在建议控件中。

public class JWTValidarFilter extends BasicAuthenticationFilter{

private static final String HEADER_ATRIBUTO = "Authorization";

private static final String ATRIBUTO_PREFIXO = "Bearer ";

public JWTValidarFilter(AuthenticationManager authenticationManager) {
    super(authenticationManager);
}

@Override
protected void doFilterInternal(HttpServletRequest request, 
        HttpServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    
    String atributo = request.getHeader(HEADER_ATRIBUTO);
            
    if(atributo == null) {
        chain.doFilter(request, response);
        return;
    }
    
    if(!atributo.startsWith(ATRIBUTO_PREFIXO)) {
        chain.doFilter(request, response);
        return;
    }
    
    String token = atributo.replace(ATRIBUTO_PREFIXO, "");
    
    UsernamePasswordAuthenticationToken authenticationToken = getAuthenticationToken(token);
    SecurityContextHolder.getContext().setAuthentication(authenticationToken);
    chain.doFilter(request, response);
    
    
}

private UsernamePasswordAuthenticationToken getAuthenticationToken(String token) {
    
    
    try {
        String usuario = JWT.require(Algorithm.HMAC512(JWTAutenticarFilter.TOKEN_SENHA))
                .build()
                .verify(token)
                .getSubject();
        if(usuario == null) {
            return null;
        }
        
        return new UsernamePasswordAuthenticationToken(usuario, null, new ArrayList<>());

    } catch (TokenExpiredException e) {
        throw new TokenExpiredException("Token expirado!");
    }
    
}
@ControllerAdvice
@RestController
public class CustomizeResponseEntityExceptionHandler extends ResponseEntityExceptionHandler{

    @ExceptionHandler(Exception.class)
    public final ResponseEntity<ExceptionResponse> handleAllExcepetions(Exception ex, WebRequest request){
        ExceptionResponse exceptionResponse = 
                new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));
        
        return new ResponseEntity<>(exceptionResponse, HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(InvalidJwtAuthenticationException.class)
    public final ResponseEntity<ExceptionResponse> invalidJwtAuthenticationException(Exception ex, WebRequest request){
        ExceptionResponse exceptionResponse = 
                new ExceptionResponse(new Date(), 
                        ex.getMessage(), 
                        request.getDescription(false));
        
        return new ResponseEntity<>(exceptionResponse, HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(TokenExpiredException.class)
    public final ResponseEntity<ExceptionResponse> TokenExpiredException(TokenExpiredException ex, WebRequest request){
        ExceptionResponse exceptionResponse = 
                new ExceptionResponse(new Date(), 
                        ex.getMessage(), 
                        request.getDescription(true));
        
        return new ResponseEntity<>(exceptionResponse, HttpStatus.UNAUTHORIZED);
    }

    
    @ExceptionHandler(HttpClientErrorException.class)
    public ResponseEntity<String> handleException(HttpClientErrorException ex) throws HttpClientErrorException {
        System.out.println("*******Exception Occured: *************" + ex);
        return ResponseEntity
                .status(HttpStatus.UNAUTHORIZED)
                .body(" -----DD------ Exception: " + ex.getLocalizedMessage());
    }
}

2021-09-28 10:13:38.729错误25385---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()对于路径[]上下文中的servlet[dispatcherServlet]抛出异常com.auth0.jwt.exceptions.TokenExpiredException:Token Expirado!

共有1个答案

尉迟明贤
2023-03-14

尝试构建自定义AuthenticationFailureHandler,如下所示:

public class CustomAuthenticationFailureHandler 
  implements AuthenticationFailureHandler {
 
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
       AuthenticationException exception) throws IOException, ServletException {

        Throwable cause = exception.getCause();
        ExceptionResponse exceptionResponse = null;

        if (cause instanceOf InvalidJwtAuthenticationException) {
          response.setStatus(HttpStatus.BAD_REQUEST.value());
          exceptionResponse = new ExceptionResponse(new Date(), 
                cause.getMessage(), 
                request.getDescription(false));
        } else if (cause instanceOf TokenExpiredException) {
          response.setStatus(HttpStatus.UNAUTHORIZED.value());
          exceptionResponse = new ExceptionResponse(new Date(), 
                ex.getMessage(), 
                request.getDescription(true));
        } else {
          // additional logic here
        }

        response.getOutputStream().println(objectMapper.writeValueAsString(exceptionResponse));
    }
}

然后需要将其注册到@configuration类中:

@Bean
public AuthenticationFailureHandler authenticationFailureHandler() {
    return new CustomAuthenticationFailureHandler();
}
 类似资料:
  • 行中有错误: 错误:

  • 这是我的 Firebase 消息服务代码文件。我的服务未被调用。

  • 本文向大家介绍springboot中自定义异常以及定制异常界面实现过程解析,包括了springboot中自定义异常以及定制异常界面实现过程解析的使用技巧和注意事项,需要的朋友参考一下 不多说废话,直接进入主菜!! 步骤: 1.搭建SpringBoot的开发环境,略(有不会的可以私信我)。 2.编写一个自定义异常,自定义异常需要继承RuntimeException。写一个构造函数,并调用父类保存异常

  • 我在整个代码中有一堆常量,用于系统的各种可调整属性。我正在将它们全部移动到一个中央文件中。我目前的解决方案是有一个静态加载文件并公开各种getter方法,如下所示: 唯一的问题是,对于我从这个文件中获得的每个常量,我都有一些样板: 我不认为我想使用Spring或类似的东西,因为那看起来更像是boilerplae。我希望使用自定义注释来解决这个问题。我找到了这个教程,但是我真的不能弄清楚如何从注释处

  • 我有一个Web应用程序,使用log4j。我在 /WEB-INF/classes/log4j.properties文件中配置了一个自定义记录器,如下所示: 日志消息按预期写入server.log,但我试图找到一种方法来控制自定义记录器日志级别通过glassfish服务器。 我尝试从命令中创建glassfish中的记录器: 但是,即使asadmin命令将记录器设置为警告,所有INFO消息仍然会被记录。

  • 我有以下try块: 我想从捕获潜在的错误。经过反复试验,我能够生成一个潜在错误列表,这些错误可以通过打印它们的类型(e)由触发。__name__值: 但是如果我尝试将我的except语句从修改为,我将得到一个错误,即未定义。 我尝试定义一个类扩展为它,大多数教程/问题在这里建议,基本上: 现在这个变量已被识别,但由于我无法控制将引发的错误,因此我无法在我的初始try块中真正引发该异常。 理想情况下