Как установить ограничение на входящий объект HTTPServletRequest? - PullRequest
0 голосов
/ 04 сентября 2018

Я ищу варианты, чтобы установить максимальный лимит на входящий HTTP-запрос, например, экземпляр хочет установить лимит не более 6 МБ? Как мне этого добиться?

Мой фрагмент кода;

public String getContent(HttpServletRequest request)
                    throws IOException {

                StringBuffer lines = new StringBuffer();
                try {
//Tried the below line not sure if it is right but did not work    
//BufferedReader reader = new BufferedReader(request.getReader(),60048);

                   if(req.getContentLength()< 600048) {
                    BufferedReader reader = request.getReader();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        lines.append(line);
                    }
                    reader.close();
                } catch (IOException exc) {

                    throw exc;
                }
                return lines.toString();
            }

           }//Check for size ends here
        }

1 Ответ

0 голосов
/ 04 сентября 2018

Существует несколько возможных способов реализации такой функциональности. На этот раз я не очень знаком с WebSphere, поэтому поправьте меня, если я ошибаюсь.

  • Вариант 1. Обработка на уровне сервера

WebSphere предлагает свойство конфигурации, очень похожее на maxPostSize Tomcat. Для случая Tomcat это ограничивает максимальный размер поста на уровне соединителя. Я полагаю, что эквивалент для этого для WebSphere PostSizeLimit. Вы можете изменить файл конфигурации сервера приложений и установить для него нужный размер (в байтах).

  • Вариант 2 - Программная обработка

HttpServletRequest не предлагает готовый способ проверки размера входящего запроса. Для преодоления этого есть два варианта. Один из них - попытаться получить значение заголовка Content-Length. Проблема в том, что это может присутствовать не всегда. Еще одна потенциальная проблема для этого, это то, что это возвращает только размер тела (не включая заголовки), как это определено здесь .

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

Другой способ - попытаться использовать ServletRequest#getContentLength, который также может вернуть размер тела.

Последний последний способ для вас - получить inputStream запроса, используйте BufferedReader, чтобы прочитать его локально и сохранить в байтовом массиве. Имея это в виду, вы сможете определить размер. Единственная проблема, связанная с этим решением, состоит в том, что входной поток HttpServletRequest может быть прочитан только один раз, а это означает, что вам нужно как-то его кешировать (решение на основе фильтров будет работать для этого очень хорошо).

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

Я надеюсь, что помощь выше.

...