Можно ли написать фильтр сервлета для проверки кодов ответов HTTP?

Можно ли написать фильтр сервлета для проверки кодов ответов HTTP?

Я хочу написать фильтр, который будет неразрушающим образом проверять исходящие коды ответов HTTP. Но похоже, что в объекте Response нет метода, похожего на getResponseCode().

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

Идеи?

(Мой другой подход включает в себя написание собственного клапана Tomcat, но это не так портативно.)


person Stu Thompson    schedule 29.06.2009    source источник
comment
Как так получилось, что я задал вопрос первым, но Этот вопрос уже задавали раньше, и на него уже есть ответ. Другой вопрос пришел два месяца спустя. Это не дубликат?   -  person Stu Thompson    schedule 01.06.2015


Ответы (2)


вы можете обернуть исходящий ответ, используя HttpServletResponseWrapper< /а>:

class GetStatusWrapper extends HttpServletResponseWrapper {

    private int status;

    GetStatusWrapper(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void setStatus(int sc) {
        super.setStatus(sc);
        status = sc;
    }

    public int getStatus() {
        return status;
    }
}

затем в вашем фильтре:

public class GetStatusResponseFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, 
                         ServletResponse response, 
                         FilterChain filterChain) 
                            throws IOException, ServletException {
        GetStatusWrapper wrapper;
        wrapper = new GetStatusWrapper((HttpServletResponse) response);
        filterChain.doFilter(request, wrapper);
        System.out.println("status = " + wrapper.getStatus());
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}
person dfa    schedule 29.06.2009
comment
ОК, при реализации этого я столкнулся с тремя проблемами: ОДНА) Существуют и другие методы, которые устанавливают статус, но я их устранил (надеюсь.) ДВА), если статус не задан явно (как это происходит в моем тесты), значит ли это, что я могу с уверенностью предположить, что это 200 OK? ТРИ) Что произойдет, если, например, super.sendRedirect() выдаст ошибку? Я начинаю находить этот подход слишком многословным и не уверен, что смогу захватить SC с полномочиями в 100% случаев. - person Stu Thompson; 29.06.2009
comment
1) это только посмотреть, работает ли реализация. 2) абсолютно 3) это реальная проблема 4) ИМХО, нет других портативных подходов, таких как этот; есть только несколько методов, которые вы должны переопределить - person dfa; 29.06.2009
comment
Хорошо, это в производстве и, кажется, работает. Спасибо. В конце концов, я инициализирую состояние int значением 200, переопределяю различные методы setStatus, sendError и sendRedirect с помощью внутренних блоков try/catch. - person Stu Thompson; 05.07.2009
comment
Добро пожаловать, можете ли вы опубликовать где-нибудь полный класс? - person dfa; 05.07.2009

Не могли бы вы написать прокси-оболочку вокруг исходного класса ответа? Таким образом, вы можете обрабатывать события/вызовы методов для объекта.

person stjohnroe    schedule 29.06.2009
comment
Да, я не разбираюсь в деталях. Как в этом случае будут обрабатываться необработанные исключения? Будет ли моя прокси-оболочка передана обратно в стек вызовов, где можно будет изменить код состояния? (Я действительно не знаю, возможно ли это.) - person Stu Thompson; 29.06.2009