바보, 삽질을 하다.

public class WBAccessDeniedHandler implements AccessDeniedHandler {
 
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOExceptionServletException {
        String redirectUrl = "/";
        response.sendRedirect(redirectUrl);
    }
}

redirectUrl 는 반드시 / 으로 시작해야 한다. 안그러면…​ 접근한 requestUrl 에 끊없이 redirectUrl 붙다가 오류가 난다.


HttpServletResponse 의 sendRedirect 메서드를 사용하다가 다음과 같은 메시지가 나왔다.

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:494)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
at org.springframework.security.web.firewall.FirewalledResponse.sendRedirect(FirewalledResponse.java:41)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
at org.springframework.security.web.util.OnCommittedResponseWrapper.sendRedirect(OnCommittedResponseWrapper.java:128)
at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:138)
at org.springframework.security.web.util.OnCommittedResponseWrapper.sendRedirect(OnCommittedResponseWrapper.java:128)
  // 중략

이런 코드가 발생하는 경우를 찾아보면, 다음처럼 되어 있었다.

String redirectUrl = request.getRequestURI();
 
if(user.getStatus() == UserStatus.EMAIL_VERIFY) {
    response.sendRedirect(URL_SIGNUP_PROGRESS);
}
 
if(request.getRequestURI().contains("login") || request.getRequestURI().contains("sign")) {
    response.sendRedirect(URL_ROOT);
}
 
response.sendRedirect(redirectUrl);

예외 메시지를 살펴보니 sendRedirect 메서드가 호출된 이후에 재호출하려고 하면 java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed 가 출력되는 것이다. 호출된 이후에는 다시 호출할 수 없다는 뜻으로 변경할 수 없다는 뜻이다.

이에 대한 해결책을 좀 찾아봤다.

이걸 해결항 수 있는 방법으로는,

String redirectUrl = request.getRequestURI();
 
if(user.getStatus() == UserStatus.EMAIL_VERIFY) {
    response.sendRedirect(URL_SIGNUP_PROGRESS);
} else if(request.getRequestURI().contains("login") || request.getRequestURI().contains("sign")) {
    response.sendRedirect(URL_ROOT);
} else {
    response.sendRedirect(redirectUrl);
}

와 같은 방식으로 완전히 조건문 내에서 한번만 호출되도록 처리하거나,

String redirectUrl = request.getRequestURI();
 
if(user.getStatus() == UserStatus.EMAIL_VERIFY) {
    redirectUrl = URL_SIGNUP_PROGRESS;
}
 
if(request.getRequestURI().contains("login") || request.getRequestURI().contains("sign")) {
    redirectUrl = URL_ROOT;
}
 
response.sendRedirect(redirectUrl);

위의 코드처럼 조건을 모두 마친 후에 마지막에 sendRedirect 를 호출하는 것이다. 마지막 방법이 좀 더 괜찮은 처리방법이라는 생각이…​


+ Recent posts