Получить объект HttpServletRequest (запрос) из кода Java

Вот сообщение в блоге , которое должно помочь с экранированием тиков в строках.

Вот простейший из указанных сообщений:

простым и наиболее распространенным способом является использование одной кавычки с двумя одиночными кавычками в обеих сторонах.

SELECT 'тестовая одиночная кавычка' '' из dual;

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

test single quote '

Просто заявив, что вам нужен дополнительный символ одиночной кавычки для печати одного символа quote>. То есть, если вы поместите два символа одной кавычки, Oracle будет печатать один. Первый> действует как escape-символ.

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

blockquote>

13
задан Michael Currie 11 September 2015 в 05:49
поделиться

5 ответов

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

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

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

18
ответ дан 1 December 2019 в 19:31
поделиться

Джон Скит сказал практически все, но одно уточнение к его совету «только те биты, которые вам нужны» - если вам нужно передать параметры вашего запроса, но вам не нужна зависимость от HttpServletRequest , передать request.getParameterMap () .

И немного расширить параметр ThreadLocal - у вас может быть фильтр , который обрабатывает все входящие запросы и устанавливает запрос в

public final static ThreadLocal<HttpServletRequest> httpServletRequestTL =
      new ThreadLocal<HttpServletRequest>();

Поскольку вы устанавливаете его для каждого запроса (осторожно с сопоставлением фильтров), вам не придется беспокоиться о пуле потоков контейнера сервлета - у вас всегда будет текущий запрос .

PS это логика, лежащая в основе утилиты spring, предложенной скаффманом - я присоединяюсь к нему, рекомендуя стабильный компонент, а не создавать свой собственный.

4
ответ дан 1 December 2019 в 19:31
поделиться

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

Spring предоставляет RequestContextFilter именно для этой цели. Он использует ThreadLocal и позволяет коду получать текущий запрос через RequestContextHolder . Обратите внимание, что этот фильтр не требует, чтобы вы использовали какую-либо другую часть Spring:

Фильтр сервлета 2.3, который предоставляет запрос к текущему потоку через как LocaleContextHolder, так и RequestContextHolder. Быть зарегистрированным как фильтр в web.xml.

Этот фильтр в основном используется с сторонние сервлеты, например JSF FacesServlet. В собственной сети Spring поддержка, DispatcherServlet's обработки вполне достаточно.

Если вы собираетесь использовать ThreadLocal , то лучше использовать существующее, работающее решение, чем рисковать появлением ошибок, которые код ThreadLocal является склонны к.

9
ответ дан 1 December 2019 в 19:31
поделиться

Для этого не существует API сервлета. Однако Tomcat предоставляет для этого вызов API,

HttpServletRequest request = (HttpServletRequest)org.apache.catalina.core.ApplicationFilterChain.getLastServicedRequest(); 

Это получит последний запрос, переданный сервлету для обслуживания из текущего потока.

Для того, чтобы это работало, Tomcat должен находиться в «Строгом соответствии сервлетам» Режим. Если нет, вам нужно включить его, добавив этот параметр JVM:

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
4
ответ дан 1 December 2019 в 19:31
поделиться

Предполагая, что сервлет верхнего уровня действительно является табу по какой-то сумасшедшей бизнес-причине, все еще есть возможность определить ServletFilter для предварительного просмотра запроса и прочего это в ThreadLocal. Предполагая, что web.xml также не является священным.

Но я согласен с Джоном Скитом в том, что это было бы очень некрасиво. Я бы запрограммировал это, а затем попытался бы найти другую работу. :)

На самом деле, учитывая тот факт, что фильтр может полностью отобрать контроль у принимающего сервлета, вы можете использовать эту технику, чтобы перенаправить код на свой собственный сервлет, делать все, что вы хотите, а ЗАТЕМ запустить другой, "официальный" сервлет ... или что-нибудь еще в этом роде. Некоторые из этих решений даже позволят вам правильно и надежно работать с данными вашего запроса.

0
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: