유저 회원가입 테스트 중 getWriter() has already been called for this response 출력
ExceptionHandeler에서 문제가 났다고 하길래, Exception을 안 내면 되겠다 생각
Exception을 안 내도 getWriter 오류 발생
response를 반환해야하는데, 이미 getWriter()가 쓰였기 때문에 안 된다는 의미 같은데
JwtAuthorizationFilter에서 오류가 난다고 한다
이 부분에서 난다.
@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);
}
}