getReader() и getInputStream() в веб приложении

205
08 марта 2022, 23:10

Столкнулась с проблемой что нельзя одновременно у одного request вызвать и getReader(), и getInputStream(), в документации написано что нельзя и на практике выдаёт ошибку

java.lang.IllegalStateException: getReader() has already been called for this request 

Сервлет менять нельзя:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Part part = request.getPart("file");
    InputStream cover = part.getInputStream();
    String id = request.getParameter(Constants.KEY_ID);
    getBookDAO().uploadBookCover(Integer.parseInt(id), cover);
}

Нужно в фильтре отслеживать request к этому сервлету и проверять допустимые разрешения файлов.Пока что такой набросок фильтра

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    BufferedReader reader = request.getReader();
    reader.lines().filter(str -> str.startsWith("Content-Type")).forEach(System.out::println);
    filterChain.doFilter(request, servletResponse);
}

Как можно иначе достать расширение файла из request или может как можно после getReader() откатить request для возможности getInputStream() ???

Answer 1

В вашем случае правильным решением было бы создать два фильтра разделив функционал и объединить их в цепочку, если это конечно возможно.

В противном случае вам потребуется реализация обертки для вашего запроса, которая по сути скопирует его содержимое в буфер или кэш.

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

READ ALSO
Как считать xml-файл в String, оставляя пробелы,но удаляя переносы строк?

Как считать xml-файл в String, оставляя пробелы,но удаляя переносы строк?

Как считать xml-файл полностью в String, оставляя пробелы,но удаляя переносы строк?

107
No bean named 'entityManagerFactory' available при тестировании в Spring Boot

No bean named 'entityManagerFactory' available при тестировании в Spring Boot

подскажите пожалуйста как решить данную проблему, в интернете решения не помоглиВывод консоли при тестировании:

98
Приложение вылетает при использовании AsyncTask<> Android

Приложение вылетает при использовании AsyncTask<> Android

Пишу приложение на Android Studio конвертер валют, но столкнулся с проблемойПриложение вылетает при нажатии на кнопку "рассчитать"

105
Spring security

Spring security

при такой конфигурации всё работает, авторизация прохожу

218