Столкнулась с проблемой что нельзя одновременно у одного 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() ???
В вашем случае правильным решением было бы создать два фильтра разделив функционал и объединить их в цепочку, если это конечно возможно.
В противном случае вам потребуется реализация обертки для вашего запроса, которая по сути скопирует его содержимое в буфер или кэш.
Ну и как вам подсказали в комментариях - нежелательно на уровне фильтров лезть в body, а вместо этого использовать атрибуты.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как считать xml-файл полностью в String, оставляя пробелы,но удаляя переносы строк?
подскажите пожалуйста как решить данную проблему, в интернете решения не помоглиВывод консоли при тестировании:
Пишу приложение на Android Studio конвертер валют, но столкнулся с проблемойПриложение вылетает при нажатии на кнопку "рассчитать"