重定向来自过滤器的响应会抛出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本身,或您发送重定向,它在这一点上应该没问题,除非先前的过滤器已经有(可能是间接的)承诺了回应。
也许你有定义其他过滤器,这一个过滤器链之前执行。这些/这些过滤器可能正在使用该响应,以便在执行到达过滤器时它不处于合法状态以进行重定向。
在过滤声明的顶端移动你的filter声明。
或者也许其他过滤器正在做一个重定向/转发和链继续。无论确实将过滤器移动到顶部,它应该按预期工作。 – BalusC 2010-03-05 12:58:51
你的过滤器看起来不错,另一个过滤器必须过滤器,然后运行和提交的响应。
确保您的过滤器映射元素是你会喜欢的应用,过滤器定义元素的顺序并不重要的顺序。
为了确保这不是问题,尝试删除所有其他过滤器映射。
我不认为任何其他过滤器正在写入响应,当我检查,这是第一个过滤器。它似乎很平凡,但我无法通过这个:( – 2010-03-08 04:39:29