重定向来自过滤器的响应会抛出IllegalStateException

问题描述:

我正在编写一个过滤器来处理所有与身份验证相关的任务。我的过滤器是一个标准的Servlet过滤器如下图所示重定向来自过滤器的响应会抛出IllegalStateException

@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中这是一个问题,因为响应对象已经被提交。我如何克服这个问题?

你是否在过滤器链中的其他地方提交响应?通常在你开始写入servlet本身的响应的OutputStream之前,这些操作不会完成。在您的过滤方法,不过,您要么转发过滤器链的请求到下一个元素或最终的servlet本身,您发送重定向,它在这一点上应该没问题,除非先前的过滤器已经有(可能是间接的)承诺了回应。

+0

我不认为任何其他过滤器正在写入响应,当我检查,这是第一个过滤器。它似乎很平凡,但我无法通过这个:( – 2010-03-08 04:39:29

也许你有定义其他过滤器,这一个过滤器链之前执行。这些/这些过滤器可能正在使用该响应,以便在执行到达过滤器时它不处于合法状态以进行重定向。

在过滤声明的顶端移动你的filter声明。

+0

或者也许其他过滤器正在做一个重定向/转发和链继续。无论确实将过滤器移动到顶部,它应该按预期工作。 – BalusC 2010-03-05 12:58:51

你的过滤器看起来不错,另一个过滤器必须过滤器,然后运行和提交的响应。

确保您的过滤器映射元素是你会喜欢的应用,过滤器定义元素的顺序并不重要的顺序。

为了确保这不是问题,尝试删除所有其他过滤器映射。