2016-08-10 2 views
1

스프링 부트를 사용하여 API를 작성하고 있습니다. 요청 헤더에서 토큰을 가져 와서 인증하는 인증 필터를 설정했습니다. 토큰을 사용하여 사용자를 찾을 수 없으면 InvalidWSUserException이 발생합니다.스프링 부트 @ExceptionHandler가 관련 예외를 catch하지 않습니다.

InvalidWSUserException을 잡아 내고 요청중인 클라이언트가 요청한 토큰이 유효하지 않다는 것을 요청하는 JSON 문자열로 응답 할 수 있도록 여러 개의 @ExceptionHandler를 보유 할 클래스를 만들었습니다.

다른 프로젝트에서이 작업을 수행했지만이 새 프로젝트에서 작동하지 못하는 것 같습니다.

처리기가 응답을 처리해야하므로 InvalidWSUserException은 비어 있습니다.

public class InvalidWSUserException extends RuntimeException { 
} 

나는 핸들러 클래스를 이와 같이 정의했습니다.

@ControllerAdvice 
public class ExceptionController { 

    @ExceptionHandler(value=InvalidWSUserException.class) 
    public ResponseEntity invalidWSUserException(InvalidWSUserException exception) { 
     return new WSResponse().send(HttpStatus.UNAUTHORIZED, "Invalid token."); 
    } 

} 

나는 예외를 던지고 클래스가 콩을 통해 봄에 의해 초기화되지 않은 이전 프로젝트에 문제가 있었다, 그러나 나는이 수업을 통해 확인했습니다, 그리고 클래스가 제기되는 예외는 @Autowired 주석에 의해 인스턴스화됩니다.

왜 @ExceptionHandler가 내가 생각하는대로하지 않는지 이해하는 데 어려움을 겪고 있습니다.

확인하려면 브라우저에서 볼 수있는 출력은 오류 500 json 응답입니다. 그것은 @ExceptionHandler

{ 
    "timestamp": 1470833849289, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "digital.sheppard.exceptions.InvalidWSUserException", 
    "message": "No message available", 
    "path": "/api/product" 
} 

답변

-1

위 넣어 내가 JSON Web Token for Java 라이브러리 사용하고있어에서 EntityResponse해야한다로 어디, 나는 인증 서비스에서 동일한 오류가 있었다. @ControllerAdvice로 시도했지만 해결책이 없습니다.

오랜 연구 끝에 해결책을 찾았습니다. 당신이 볼 수 있듯이

if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());  
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

final String token = authHeader.substring(7); 

try { 
    final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody(); 
    request.setAttribute("claims", claims); 
} catch (final SignatureException e) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());   
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

chain.doFilter(req, res); 

, 나는 예외 출시 주석 및 I했습니다 대신 예외를 시작, 당신은 다음을 추가하기 위해 귀하의 HttpServletResponse 값을 수정해야합니다, 당신의 JwtFilter을 구현해야하고, 응답 헤더 대체를 위해이를 변경하십시오. getErrorJson()은 JSON 값을 문자열로 반환합니다 (또는 문자열은 본문으로 만 사용할 수 있습니다).

이 정보가 도움이되기를 바랍니다.

경찰력 : 저는 인증을 구현하기 위해이 instructions을 따라 왔습니다.

관련 문제