OncePerRequestFilter не может установить код ошибки, отличный от 404 - PullRequest
1 голос
/ 01 апреля 2019

У меня приложение Spring (не использующее Spring boot), развернутое на tomcat

Я пытаюсь вернуть ошибку 401 (HttpServletResponse.SC_UNAUTHORIZED) по конкретным URL в указанном условии, используя OncePerRequestFilter,

Но я продолжаю получать сообщение Не найдено:

Response code: 404

Мой фильтр (снятые условия):

@Component
public class MyFilter extends OncePerRequestFilter {

    private static final Logger logger = Logger.getLogger(MyFilter.class);
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Not autorized");           
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            try {
                PrintWriter out = response.getWriter();
                out.write(""); // Empty
                out.flush();
            } catch (IOException e) {
                logger.error("error filtering", e);
            }
            return; // stop chain
    }    
}

Я пытался использовать код, аналогичный предыдущий аналогичный ответ

Полагаю, вы можете response.sendError внутри сделать метод Filter.

EDIT

Если я просто выбрасываю исключение, я получаю общий код ошибки 500

Response code: 500

РЕДАКТИРОВАТЬ 2

Я добавляю фильтр внутрь onStartup Переопределенный метод WebApplicationInitializer

FilterRegistration myFilter = servletContext.addFilter("myFilter ", MyFilter.class);
myFilter.addMappingForUrlPatterns(null, false, "/myservlet/myendpoint/*");

РЕДАКТИРОВАТЬ 3

Также мой фильтр в @Componenet и его пакет включают в компонентное сканирование

@ComponentScan(basePackages = { "my.parent.pacakge"})

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Я попробовал ваш код, и он работает. Различные коды ошибок были успешно возвращены. Хотя я хочу указать на пару вещей ...

  1. Метод sendError() отправляет ответ клиенту, а также очищает буфер ответов. Таким образом, все, что вы пишете после этого в ответ после этого, бесполезно.
  2. Вызов setStatus() также бесполезен. Ответ HTTP и код ответа HTTP уже были отправлены клиенту в строке выше, когда вы позвонили sendError().

Теперь, это моя гипотеза, почему ваш код не работает для вас, но это для меня

Причина, по которой вы можете получить HTTP 404, заключается в том, что ваш API отсутствует. Это может произойти из-за орфографической ошибки или из-за простого невежества, например, вызова вашего API с именем /foo/bar, например, /foo/bar/, т. Е. С дополнительной косой чертой. Я считаю, что ваш фильтр успешно выполняется, и вы должны делать что-то полезное, а не пример кода sendError(), который вы объяснили в вопросе.

Кроме того, когда вы выбрасываете исключение в свой фильтр, элемент управления не достигает API, и поиск API не происходит. Следовательно, ответ HTTP 500 по умолчанию отправляется клиенту из-за необработанного исключения вместо HTTP 404.

0 голосов
/ 23 мая 2019

Возвращает 401, как и ожидалось, только если setStatus выполняется после out.write

PrintWriter out = response.getWriter();
out.write("");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
...