Я настраиваю функции COMET в своем веб-приложении (с помощью таких функций Servlet 3.0, как AsyncContext и startAsync ), чтобы разрешать такие вещи, как уведомления в режиме реального времени. После добавления фильтра перед единственным сервлетом я понял, что эта функция больше не работает, потому что ответы передаются автоматически после пересылки.
Запросы для настройки функциональности COMET требуют, чтобы ответы НЕ были зафиксированы после обработки запроса. Это означает, что я не могу использовать переадресацию или перенаправление для передачи обработки моему сервлету. Таким образом, я застрял с использованием doFilter (), который, насколько мне известно, не выполняет автоматическую фиксацию ответов после выполнения.
Я думал, что смогу обернуть запросы в пользовательский HTTPServletRequestWrapper
, который переопределяет все методы, имеющие дело с URL, например:
public class ActionServletRequestWrapper extends HttpServletRequestWrapper
{
public ActionServletRequestWrapper(HttpServletRequest request)
{
super(request);
}
@Override
public String getRequestURI()
{
String originalRequestURI = super.getRequestURI();
int lastSlashIndex = originalRequestURI.lastIndexOf("/");
return originalRequestURI.substring(0, lastSlashIndex) + "/ActionServlet";
}
@Override
public StringBuffer getRequestURL()
{
String originalRequestURL = super.getRequestURI();
int lastSlashIndex = originalRequestURL.lastIndexOf("/");
return new StringBuffer(originalRequestURL.substring(0, lastSlashIndex) + "/ActionServlet");
}
@Override
public String getServletPath()
{
return "/ActionServlet";
}
}
... но передача этого в doFilter()
, похоже, не передает выполнение в ActionServlet
(хотя через точки останова я обнаружил, что переопределенный getServletPath()
вызывается в некоторый момент). Есть ли какие-либо дополнительные методы, которые мне нужно перегрузить, или запросы не могут быть перенаправлены таким образом?