Перенаправление ответа от фильтра вызывает исключение IllegalStateException - PullRequest
2 голосов
/ 05 марта 2010

Я пишу фильтр, который будет обрабатывать все задачи, связанные с аутентификацией. Мой фильтр является стандартным фильтром сервлетов, как показано ниже

@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;
    }      
  }

Но когда я делаю это, я получаю исключение IllegalStateException, выданное Tomcat ResponseFacade. Как мне добиться этого в фильтре. Я читал в других потоках SO, что в TOmcat это проблема, поскольку объект ответа уже зафиксирован. Как мне пройти это?

Ответы [ 3 ]

1 голос
/ 05 марта 2010

Возможно, у вас определены другие фильтры, которые выполняются до этого в цепочке фильтров.Эти / эти фильтры могут использовать ответ, чтобы он не находился в допустимом состоянии для перенаправления в тот момент, когда выполнение достигает вашего фильтра.

Переместите объявление фильтра в верхнюю часть объявлений фильтра.

0 голосов
/ 28 апреля 2010

Ваш фильтр выглядит нормально, другой фильтр должен быть запущен до того, как ваш фильтр отправит ответ.

Убедитесь, что элементы сопоставления фильтра расположены в том порядке, в котором вы хотите их применить, порядок элементов определения фильтра не имеет значения.

Чтобы убедиться, что это не проблема, попробуйте удалить все остальные сопоставления фильтров.

0 голосов
/ 05 марта 2010

Вы фиксируете ответ где-нибудь еще в цепочке фильтров?Обычно это не делается до тех пор, пока вы не начнете писать в OutputStream ответа в самом сервлете.В вашем методе фильтрации вы, однако, либо перенаправляете запрос следующему элементу в цепочке фильтров, либо в конечном итоге сам сервлет, или , вы отправляете перенаправление, что на этом этапе должно быть в порядке, если предыдущий фильтр уже(возможно косвенно) совершил ответ.

...