Могу ли я обернуть запрос и отфильтровать его где-нибудь, кроме исходного пункта назначения? - PullRequest
0 голосов
/ 22 февраля 2012

Я настраиваю функции 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() вызывается в некоторый момент). Есть ли какие-либо дополнительные методы, которые мне нужно перегрузить, или запросы не могут быть перенаправлены таким образом?

1 Ответ

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

Учитывая тот факт, что никто еще не ответил на вопрос, и все мои попытки отфильтровать запрос таким образом потерпели неудачу, я собираюсь пойти дальше и предположить, что ответ на этот вопрос:

Нет, вы не можете отфильтровать запрос к другому месту назначения, обернув его и перегружая все методы, связанные с URL.Код, который определяет места назначения запросов, по-видимому, не использует эти методы.

...