-
security exception을 rest advice를 적용한 것 처럼 출력하기개인 프로젝트/3. simple board 02 2024. 1. 4. 15:35
시큐리티는 FilterChain을 사용하기 때문에, controller에 도달하기 전에 FilterChain을 통한 인증 / 권한 검증을 진행한다.
그렇기 때문에 Filter에서 exception이 발생하게 되면
해당 filter에서 나아가는것을 멈추기 때문에 관련 정보가 controller advice로 수집되지 않고,
해당 filter를 호출했던 곳으로 거슬러 올라가다가 catch절에 걸리거나 response exception을 출력하는 곳을 만나게 되면서 exception을 터트린다.
맨 위에 참고한 블로그를 통해 학습 한 후 filter에서 발생하는 exception을 핸들링 할 필터를 만든 후 시큐리티에 필터로 등록해주었다.
작성해본 exception을 핸들링 할 필터는
@Slf4j @Component public class ExceptionHandlerFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { filterChain.doFilter(request, response); } catch (RuntimeException e) { response.setStatus(SC_BAD_REQUEST); response.setContentType("application/json;charset=UTF-8"); response.getWriter().print(new ObjectMapper().writeValueAsString(ApiResponse.<Void>builder() .status(false) .message(e.getMessage()).build())); } } }
이런 형태로 작성해주었는데,
setStatus를 적용해주지 않으면 자연스레 200 응답으로 넘어가게 되고
setContentType은 위에 작성한 것과 같이 "application/json;charset=UTF-8" 형식으로 작성해주어야 적용되었다.
마지막으로 getWriter().print()를 사용하기 전에 getWrtiter().write()를 사용했었는데,
write()를 사용하니 ascii 코드로 출력이 되었다.
String.valueOf() 등을 적용해주면 해결이 가능했겠지만 print()를 사용한다면 기본 출력형태가 unicode 형태로 출력되어 좀 더 간편하게 사용 할 수 있어서 print()를 사용하게 되었다.
'개인 프로젝트 > 3. simple board 02' 카테고리의 다른 글
Date 객체 사용 시 시간 단위 지정해서 시간 수정하기 (0) 2024.01.06 jwt 로그아웃..? (0) 2024.01.04 고민이 생겼다 (feat. jwt, security) (0) 2024.01.03 테스트 코드 체크 리스트! (0) 2023.12.28 (링크) 이메일 유효성 검사 정규식 (0) 2023.12.26