2015-01-15 4 views
0

Я использую весеннюю версию загрузки 1.1.8, у меня есть следующий перехватчик, перехватывающий все входящие HTTP-запросы, одна функциональность - это печать кода состояния ответа на рукоятке сообщения
Spring boot standalone tomcat HttpServletResponse всегда возвращает статус 200

public class TimingInterceptor extends HandlerInterceptorAdapter { 
private static final String TIME_ATTR = "startTime"; 

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
     Object handler) throws Exception { 
    request.setAttribute(TIME_ATTR, System.currentTimeMillis()); 
    boolean hasQuery = StringUtils.isNotEmpty(request.getQueryString()); 
    log.info("[START] method={} path={} {}{}", request.getMethod(), request.getRequestURI(), 
      hasQuery ? "?" : "", hasQuery ? request.getQueryString() : ""); 
    return super.preHandle(request, response, handler); 

} 

@Override 
public void postHandle(HttpServletRequest request, HttpServletResponse response, 
     Object handler, ModelAndView modelAndView) throws Exception { 
    try { 
     long duration = System.currentTimeMillis() - (long) request.getAttribute(TIME_ATTR); 

     log.info("[FINISH] method={} path={} status={} [time={}] Milisec", 
       request.getMethod(), request.getRequestURI(), response.getStatus(), duration); 
    } catch (Exception e) { 
     log.error("Error while measuring timing", e); 
    } 
    super.postHandle(request, response, handler, modelAndView); 
} 

}

При работе на встроенном котом статусы, как и ожидалось, например, в данном случае:

@RequestMapping(method = RequestMethod.GET, value = "/test") 
public ResponseEntity<Void> test(HttpServletResponse response) { 
    return new ResponseEntity<Void>(HttpStatus.CREATED); 
} 

Перехватчик напечатает 201, который (СОЗДАНО), но при работе на автономном котом перехватчик напечатает 200 также попробовал этот способ

@RequestMapping(method = RequestMethod.GET, value = "/test") 
public ResponseEntity<Void> test(HttpServletResponse response) { 
    response.setStatus(201); 
    return new ResponseEntity<Void>(HttpStatus.CREATED); 
} 

Но без успеха, любые идеи, что не так? по достоинству оценят помощь!

+0

Когда вы используете автономный tomcat, как вы его настраиваете? Как вы его развертываете? Как вы производите свою войну? «Печать» означает «возврат в браузер с кодом состояния xx»? –

+0

Дэйв внизу в основном диагностировал проблему .. можете ли вы предложить какой-нибудь обходной путь? спасибо –

+0

В конечном счете, экземпляр фильтра доступен в контексте вашего приложения. Я полагаю, вы могли бы написать компонент контекста, который мог бы удалить фильтр из контекста. Или вы можете разветвить репозиторий git, содержащий фильтр, исправить код, чтобы он работал правильно, отправить запрос на перенос в проектную строку и использовать вашу собственную исправленную версию до ее выпуска. –

ответ

0

Это ErrorPageFilter от Весенней загрузки, обертывающей HttpServletResponse. Вероятно, ошибка.

+0

Дэйв, как ты это понимаешь? 200 означает успешное, и я не вижу ничего в вопросе, касающемся фильтров страниц ошибок. Я что-то упускаю? –

+0

Посмотрите на 'ErrorPageFilter', он маскирует статус. –

+0

Вау, это плохо. –

Смежные вопросы