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
'Programming > Java' 카테고리의 다른 글
[Java] 계층 구조 데이터에서 특정 노드 찾기 (0) | 2023.06.09 |
---|---|
Hyperic Sigar 라이브러리를 이용한 JAVA 모니터링 시스템 (0) | 2023.01.27 |
[Java] 배열에 특정 값이 존재하는지 체크 / How to check whether an array contains a prticular value in java (0) | 2022.07.13 |
파일의 이름과 확장자 분리 / How to get name and extension of a file in java (0) | 2022.07.04 |
댓글