Ограничить тело ответа, которое возвращается из Spring Boot Filter - PullRequest
0 голосов
/ 08 июля 2019

Я использую spring boot-2.1.6, я объявил фильтр, который выполняет основные операции аутентификации до того, как вызов действительно достигнет контроллера.Проблема в том, что когда я выкидываю исключение из фильтра (в случае, если вызов не авторизован), это приводит к коду 500 ошибок и распечатке всей трассировки стека в теле ответа.Как я могу изменить то, что происходит или, скорее, какой ответ отправлять, когда выбрасывается это исключение

Я пытался @ControllerAdvice, но вскоре я обнаружил, что это в основном для того, когда вызов достигает контроллера, а затем это вызывает исключение.А для фильтров это не сработает.

Как я могу обработать ошибки, выброшенные из фильтров, в действительный и более удобный для разработчиков ответ?

1 Ответ

1 голос
/ 08 июля 2019

Вы можете перехватить это исключение и выбросить в качестве ответа об ошибке в фильтре.

@Component
public class AuthenticationFilter implements Filter {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        try {
            if(basicAuthenticationFails) { // Your Authentication Logic
                throw new UnAuthorizedException("Error while processing");
            }
            chain.doFilter(request, response);
        } catch (UnAuthorizedException e) { // Create a custom exception for this.
            ((HttpServletResponse) response).sendError(HttpStatus.UNAUTHORIZED.value(), "UnAuthorized);
        }
    }
}

Это вернет json, как показано ниже,

{
   "timestamp":"2019-07-08T05:47:34.870+0000",
   "status":401,
   "error":"Unauthorized",
   "message":"UnAuthorized",
   "path":"/foo"
}

Вы также можете отправить ошибку, создавclass,

try {
// Logic
} catch (UnAuthorizedException e) {
   ((HttpServletResponse) response).setStatus(HttpStatus.BAD_GATEWAY.value());
   response.getWriter().write(objectMapper.writeValueAsString(new ErrorResponse(e.getMessage())));
}
...