Java 从筛选器重定向响应会引发IllegalStateException

Java 从筛选器重定向响应会引发IllegalStateException,java,servlets,jakarta-ee,servlet-filters,Java,Servlets,Jakarta Ee,Servlet Filters,我正在编写一个过滤器,它将处理所有与身份验证相关的任务。我的过滤器是一个标准的servlet过滤器,如下所示 @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { UserSession attribute = (UserSession)request.getSess

我正在编写一个过滤器,它将处理所有与身份验证相关的任务。我的过滤器是一个标准的servlet过滤器,如下所示

@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抛出了一个非法状态异常。如何在过滤器中实现这一点。我在其他线程中读到,在TOmcat中,这是一个问题,因为响应对象已经提交。我该怎么过这关

您是否将响应提交到筛选器链中的其他位置?通常,在servlet本身中开始写入响应的OutputStream之前,不会完成此操作。但是,在筛选方法中,您要么将请求转发到筛选链中的下一个元素,要么最终转发到servlet本身,要么发送重定向,此时应该可以,除非之前的筛选已经存在(可能是间接的)已提交响应。

可能您已经定义了其他筛选器,这些筛选器在筛选器链中的此筛选器之前执行。这些筛选器可能正在使用响应,以便在执行到达筛选器时,它不处于合法的重定向状态


将您的筛选器声明移动到筛选器声明的顶部。

您的筛选器看起来很好,在您的筛选器和提交响应之前,必须运行另一个筛选器

确保您的过滤器映射元素符合您希望应用它们的顺序,过滤器定义元素的顺序并不重要


要确保这不是问题所在,请尝试删除所有其他筛选器映射。

或者其他筛选器正在执行重定向/转发和继续链操作。不管怎样,确实把过滤器移到顶部,它应该像预期的那样工作。我不认为有任何其他过滤器正在写入响应,正如我所检查的,这是第一个过滤器。这似乎很琐碎,但我无法克服:(