2010-03-05 3 views
2

모든 인증 관련 작업을 처리하는 필터를 작성하고 있습니다.필터의 응답을 리디렉션하면 IllegalStateException이 throw됩니다.

@Override 
public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 

UserSession attribute = (UserSession)request.getSession().getAttribute("user_session_key"); 
if(attribute!=null && attribute.isValid()) 
{ 
    //proceed as usual, 
    chain.doFilter(req, res); 
    return; 
    } 
    else 
    { 
    //means the user is not authenticated, so we must redirect him/her to the login page 
    ((HttpServletResponse)res).sendRedirect("loginpage"); 
     return; 
    }  
    } 

아래와 같이 내 필터는 표준 서블릿 필터입니다하지만이 작업을 수행 할 때, 나는 Tomcat의 ResponseFacade에 의해 슬로우 (자), IllegalStateException를 얻을. 이 필터를 달성하려면 어떻게해야합니까? 다른 SO 스레드에서 TOmcat에서 응답 개체가 이미 커밋되어 있으므로이 문제가 발생했습니다. 어떻게해야합니까?

답변

0

필터 체인의 다른 곳에서 응답을 보냅니 까? 일반적으로 서블릿 자체의 응답의 OutputStream에 쓰기를 시작할 때까지는 완료되지 않습니다. 그러나 필터 방법에서 요청을 필터 체인의 다음 요소 (결국 서블릿 자체, 또는)로 전달하는 중일 때 리디렉션을 보내고 있습니다. 이전 필터가 이미 간접적 인 경우가 아니면)가 응답을 보냈습니다.

+0

나는 다른 필터가 응답에 쓰고 있다고 생각하지 않는다. 그리고 내가 체크했을 때, 이것이 첫 번째 필터이다. 그것은 꽤 사소한 것처럼 보이지만 나는 이것을 지나갈 수 없습니다. ( –

1

아마도 필터 체인에서이 필터보다 먼저 실행되는 다른 필터가 정의되어있을 수 있습니다. 이 필터는 응답을 사용하므로 실행이 필터에 도달 할 때 리디렉션에 대한 합법적 인 상태가되지 않습니다.

필터 선언의 맨 위에서 필터 선언을 이동하십시오.

+0

아니면 다른 필터가 리다이렉트/포워드를 계속하고 체인을 계속합니다. 실제로 필터를 맨 위로 이동하면 예상대로 작동해야합니다. – BalusC

0

필터가 잘 보이고 필터가 실행되기 전에 다른 필터가 실행 중이며 응답을 보내야합니다.

필터 매핑 요소가 적용하려는 순서대로되어 있는지 확인하십시오. 필터 ​​정의 요소의 순서는 중요하지 않습니다.

이 문제가 아닌지 확인하려면 다른 모든 필터 매핑을 제거하십시오.

관련 문제