본문 바로가기
Programming/Java

[Servlet] FIlter에서 SendRedirect 시 Cannot create a session after the response has been committed ERROR

by 주리니e 2022. 8. 12.
728x90

[Servlet] FIlter에서 SendRedirect 시 Cannot create a session after the response has been committed ERROR

 

필터에서는 클라이언트로부터 오는 요청(request)과 최종 자원(서블릿/JSP/기타 문서) 사이에 위치하여  요청 정보를 변경하거나 클라이언트로 가는 응답(response) 사이에 위치하여 클라이언트에게 제공하는 결과를 변경할 수 있다.
필자는 클라이언트로부터 오는 요청 중 비정상적인 세션정보를 가지고 있는 경우 세션을 invalidate 시키고 사용자로 하게끔 재 로그인을 하도록 페이지 Redirect 기능을 만들던 중 아래와 같은 오류를 확인하였다.

  • 예시 오류코드
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	...
    if (1 == 1) { 
    	session.invalidate();
        ((HttpServletResponse)response).sendRedirect("/login?invalidAccess");
    }
    
    chain.doFilter(request, response);
    ...
}
javax.servlet.ServletException: java.lang.IllegalStateException: 응답이 이미 커밋된 후에는, 세션을 생성할 수 없습니다.
javax.servlet.ServletException: java.lang.IllegalStateException: Cannot create a session after the response has been committed.

 

해당 오류는 chain.doFilter가 실행되기 전에 sendReidrect를 호출함으로써 발생한다. doFilter의 response의 인자들은 변경되지 않아야 함으로 sendRedirect 메소드 호출하는 경우에는 return문을 추가하여 chain.doFilter(reuqest, response); 구문을 실행하지 않도록 한다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	...
    if (1 == 1) { 
    	session.invalidate();
        ((HttpServletResponse)response).sendRedirect("/login?invalidAccess");
        return;
    }
    
    chain.doFilter(request, response);
    ...
}

 

728x90

댓글