Как я могу вытащить код состояния HTTP из ServletResponse в ServletFilter?

Это кодирует его, как это должно, Вы могли, вероятно, UrlDecode это для возвращения его с пробелами, но это не "искажается", это просто правильно кодируется.

я не уверен, что Вы пишете, но преобразовать его назад в asp.net, это - Сервер. UrlDecode (путь). Вы также смогли использовать LocalPath, а не AbsolutePath, если это - Приложение Windows.

60
задан Etienne Neveu 17 August 2011 в 08:55
поделиться

3 ответа

Во-первых, вам нужно сохранить код состояния в доступном месте. Лучше всего обернуть ответ своей реализацией и оставить его там:

public class StatusExposingServletResponse extends HttpServletResponseWrapper {

    private int httpStatus;

    public StatusExposingServletResponse(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void sendError(int sc) throws IOException {
        httpStatus = sc;
        super.sendError(sc);
    }

    @Override
    public void sendError(int sc, String msg) throws IOException {
        httpStatus = sc;
        super.sendError(sc, msg);
    }


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

    public int getStatus() {
        return httpStatus;
    }

}

Чтобы использовать эту оболочку, вам нужно добавить фильтр сервлета, где вы можете создавать отчеты:

public class StatusReportingFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        StatusExposingServletResponse response = new StatusExposingServletResponse((HttpServletResponse)res);
        chain.doFilter(req, response);
        int status = response.getStatus();
        // report
    }

    public void init(FilterConfig config) throws ServletException {
        //empty
    }

    public void destroy() {
        // empty
    }

}
87
ответ дан 24 November 2019 в 17:30
поделиться

Напишите HttpServletResponseWrapper и переопределите все методы setStatus (), sendError () и sendRedirect (), чтобы все регистрировать. Напишите фильтр, который заменяет вашу оболочку объектом ответа при каждом запросе.

6
ответ дан 24 November 2019 в 17:30
поделиться

One thing missing from David's answer above is that you should also override the other form of sendError:

@Override
public void sendError(int sc, String msg) throws IOException {
    httpStatus = sc;
    super.sendError(sc, msg);
}
12
ответ дан 24 November 2019 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: