문제 정의

Untitled

유저 회원가입 테스트 중 getWriter() has already been called for this response 출력

ExceptionHandeler에서 문제가 났다고 하길래, Exception을 안 내면 되겠다 생각

Untitled

Exception을 안 내도 getWriter 오류 발생

response를 반환해야하는데, 이미 getWriter()가 쓰였기 때문에 안 된다는 의미 같은데

Untitled

JwtAuthorizationFilter에서 오류가 난다고 한다

Untitled

이 부분에서 난다.

@RequiredArgsConstructor
public class JwtAuthorizationFilter extends OncePerRequestFilter {

    private final JwtUtil jwtUtil;
    private final ObjectMapper objectMapper;
    private final UserDetailsServiceImpl userDetailsServiceImpl;
    private final RefreshTokenRepository refreshTokenRepository;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws ServletException, IOException {
        String accessToken = jwtUtil.resolveAccessToken(request);
        String refreshToken = jwtUtil.resolveRefreshToken(request);

        if (accessToken != null && jwtUtil.validateToken(accessToken)) {
            Claims info = jwtUtil.getUserInfoFromToken(accessToken);

            // 인증정보에 유저정보 넣기
            String email = info.getSubject();
            SecurityContext context = SecurityContextHolder.createEmptyContext();
            UserDetails userDetails = userDetailsServiceImpl.loadUserByUsername(email);
            Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails,
                    null, userDetails.getAuthorities());
            context.setAuthentication(authentication);
            SecurityContextHolder.setContext(context);

        } else if (refreshToken != null && jwtUtil.validateToken(refreshToken)) {
            Claims info = jwtUtil.getUserInfoFromToken(refreshToken);
            String username = info.getSubject();
            UserRoleEnum role = UserRoleEnum.valueOf(
                    info.get(JwtUtil.AUTHORIZATION_KEY).toString());
            if (refreshTokenRepository.existsByUsername(username)) {
                String newAccessToken = jwtUtil.createAccessToken(username, role);
                String currentRefreshToken = JwtUtil.BEARER_PREFIX + refreshToken;
                jwtUtil.addJwtToHeader(newAccessToken, currentRefreshToken, response);
            }
        } else {
            CommonResponseDto commonResponseDto = new CommonResponseDto(
                    HttpStatus.BAD_REQUEST.value(), "토큰이 유효하지 않습니다.");
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            response.setContentType("application/json; charset=UTF-8");
            response.getWriter()
                    .write(objectMapper.writeValueAsString(commonResponseDto));
        }

        filterChain.doFilter(request, response);
    }
}